std::is_invocable 是假的,但 std::invoke 有效
std::is_invocable is false but std::invoke works
以下程序的输出似乎自相矛盾:
#include <type_traits>
#include <iostream>
#include <functional>
void foo(int&){ std::cout << "calledn"; }
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
在我看来,哪个是在调用一个不可调用的函数?这是怎么回事?
decltype(a)
int
。这对应于使用 int
prvalue 调用 f
- 类似于 f(7)
。那个确实无法编译,因为非 const
的左值引用无法绑定到 prvalue 。
相反,你在main
中所做的是用左值a
调用f
,引用可以很好地绑定到该值。
要从std::is_invocable
获得正确的结果,请通过添加括号来使用 decltype
的表达式形式:
std::is_invocable_v<decltype(foo), decltype((a))>
// ^ ^
相关文章:
- 使用std::multimap迭代器创建std::list
- C++中std::resize(n)和std::shrink_to_fit之间的区别
- 指向std::invoke中成员函数对象的指针
- 将指向数据成员的指针传递给 std::invoke 时有哪些用例和有用性?
- 为什么"std::all_of"不使用"std::invoke"?
- 为什么 std::invoke 不处理函数重载
- 错误 C2893 无法专门化函数模板'unknown-type std::invoke(_Callable &&,_Types &&...)'
- 无法专用化函数模板'unknown-type std::invoke(_Callable &&,_Types &&...) noexcept(<expr>)'
- 无法通过 std::ref() 使用 auto& 参数调用 std::invoke()
- C 17结合了std :: async和std :: Invoke
- C++:创建线程时出现问题;错误 C2672:"std::invoke":找不到匹配的重载函数
- What is std::invoke in c++?
- std::is_invocable 是假的,但 std::invoke 有效
- 错误:“ Invoke”不是“ STD”的成员
- 编译器无法处理std::invoke
- 使用 std::invoke 调用模板化函数
- 何时使用 std::invoke 而不是简单地调用可调用的?
- 错误:'Failed to specialize function template' C2893 'std::invoke'
- 修改后的std::invoke/std::apply,将可调用项作为void*-possible
- std::invoke(C++1z) 如何工作