gpt4 book ai didi

c++ - std::is_invocable 为假,但 std::invoke 有效

转载 作者:IT老高 更新时间:2023-10-28 12:34:25 28 4
gpt4 key购买 nike

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

#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) is int .这对应于使用 int prvalue 调用 f——类似于 f(7)。那个确实不能编译,因为非const左值引用不能绑定(bind)到prvalue。

您在 main 中所做的是使用 lvaluea 调用 f,引用可以很好地绑定(bind)。

要从 std::is_invocable 中得到正确的结果,请使用 decltype 的表达式形式并添加括号:

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

关于c++ - std::is_invocable 为假,但 std::invoke 有效,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/48167204/

28 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com