在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&¬ a prvalue of type no_move。
在c++14中这是相同的,但保证省略使一些函数可以用 xvalue(即“ T&&”)调用,而另一些函数可以用 prvalues 类型调用T。
是否有替代方案,或者我们必须发明自己的特征来处理这种情况?
(在一个std::declval<T>返回T而不是 ,T&&的理论世界中is_invocable,我相信会做正确的事情)。