在c++17中,我们有花哨的is_invocable
新纯右值和花哨的新纯右值,它们并不是真正的值。
这允许您创建一个对象,而不必先从逻辑上构造它,然后省略构造。
我遇到了一个问题,使用std::is_invocable
来测试你是否可以调用某些东西,并且prvalue规则似乎发生冲突:
struct no_move {
no_move(no_move&&)=delete;
explicit no_move(int) {}
};
void f( no_move ) {}
现在我们可以问是否f
可以使用类型的纯右值调用no_move
?
f( no_move(1) )
std::is_invocable< decltype(&f), no_move >
不起作用,因为它使用std::declval<no_move>()
which is an xvalue like no_move&&
not a prvalue of type no_move
。
在c++14中这是相同的,但保证省略使一些函数可以用 xvalue(即“ T&&
”)调用,而另一些函数可以用 prvalues 类型调用T
。
是否有替代方案,或者我们必须发明自己的特征来处理这种情况?
(在一个std::declval<T>
返回T
而不是 ,T&&
的理论世界中is_invocable
,我相信会做正确的事情)。