使用c ++ 17,我们看到了新的is_invocable
和花哨的新prvalues,它们并不是真正的价值.
这允许您创建一个对象而无需首先在逻辑上构造它,然后忽略构造.
我遇到了一个问题,std::is_invocable
用于测试你是否可以调用某些内容,而prvalue规则似乎会发生冲突:
struct no_move {
no_move(no_move&&)=delete;
explicit no_move(int) {}
};
void f( no_move ) {}
Run Code Online (Sandbox Code Playgroud)
现在我们可以问一下是否f
可以使用类型的prvalue调用no_move
?
f( no_move(1) )
Run Code Online (Sandbox Code Playgroud)
std::is_invocable< decltype(&f), no_move >
不起作用,因为它使用的std::declval<no_move>()
是xvalue,no_move&&
而不是类型的prvalue no_move
.
在c ++ 14中,这是相同的,但保证省略使得一些函数可以用xvalue(即" T&&
")调用,而其他函数可以用prvalues类型调用T
.
有替代方案,还是我们必须发明自己的特性来处理这种情况?
(在一个理论的世界里std::declval<T>
返回T
,而不是T&&
,is_invocable
会的,我相信,做正确的事).