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

时间:2018-01-09 11:29:01

标签: 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);
}

输出结果为:

called
0
called

在我看来,调用一个不可调用的函数?这是怎么回事?

1 个答案:

答案 0 :(得分:58)

decltype(a) is int。这相当于使用f prvalue 调用int - 类似于f(7)。那个确实没有编译,因为非const左值引用不能绑定到prvalue。

您在main中正在执行的操作是使用左值 f调用a,引用可以很好地绑定到该{{1>}。

要从std::is_invocable获取正确的结果,请使用括号添加decltype的表达式:

std::is_invocable_v<decltype(foo), decltype((a))>
//                                          ^ ^