[英]std::is_invocable is false but std::invoke works
以下程序的輸出似乎與之矛盾:
#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
在我看來,哪個調用了無法調用的功能? 這里發生了什么?
decltype(a)
是int
。 這對應於使用具有int
prvalue的 f
調用-類似於f(7)
。 那個確實不能編譯,因為非const
左值引用不能綁定到prvalue。
相反,您正在main
是使用一個lvalue , a
調用f
,引用可以很好地綁定到該值 。
要從std::is_invocable
獲得正確的結果,請通過添加括號使用decltype
的表達式形式:
std::is_invocable_v<decltype(foo), decltype((a))>
// ^ ^
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.