std :: is_invocable为false但std :: invoke有效

Bar*_*uch 35 c++ c++17

以下程序的输出似乎自相矛盾:

#include <type_traits>
#include <iostream>
#include <functional>

void foo(int&){ std::cout << "called\n"; }

int main() {
    int a;
    foo(a);
    std::cout << std::is_invocable_v<decltype(foo), decltype(a)> << std::endl;
    std::invoke(foo, a);
}
Run Code Online (Sandbox Code Playgroud)

输出是:

called
0
called
Run Code Online (Sandbox Code Playgroud)

在我看来,调用一个不可调用的函数?这里发生了什么?

Que*_*tin 59

decltype(a)int.这对应于f使用int prvalue调用- 类似于f(7).那个确实不编译,因为非const左值引用不能绑定到prvalue.

你在做什么,而不是在main呼吁f左值,a以该参考可以绑定就好了.

要获得正确的结果std::is_invocable,请使用decltype括号中的表达式:

std::is_invocable_v<decltype(foo), decltype((a))>
//                                          ^ ^
Run Code Online (Sandbox Code Playgroud)

  • 或者在这种情况下使用`decltype((a))`: - S. (10认同)
  • @baruch值类别是表达式的属性,而不是类型的属性.你可以使用类型为`int`的表达式,它们是lvalues(例如`a`),xvalues(例如`std :: move(a)`)或prvalues(例如`a + 1`). (4认同)