以下程序的输出似乎自相矛盾:
#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
在我看来,调用一个不可调用的函数?这是怎么回事?
答案 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))>
// ^ ^