gpt4 book ai didi

c++ - 为什么 C++ 编译器不能推导出 lambda 参数的类型?

转载 作者:行者123 更新时间:2023-12-04 08:30:17 24 4
gpt4 key购买 nike

这个问题在这里已经有了答案:





C++11 does not deduce type when std::function or lambda functions are involved

(3 个回答)


9 个月前关闭。




我有以下代码,无法编译

template <typename T>
void call_with(std::function<void(T)> f, T val) {
f(val);
}

int main() {
auto print = [](int x) { std::cout << x; };
call_with(print, 42);
}
编译错误看起来像
tst.cpp:17:2: error: no matching function for call to 'call_with'
call_with(print, 42);
^~~~~~~~~
tst.cpp:11:6: note: candidate template ignored: could not match 'function<void (type-parameter-0-0)>' against
'(lambda at tst.cpp:16:15)'
void call_with(std::function<void(T)> f, T val) {
^
1 error generated
我试着用 g++ tst.cpp -o tst -std=c++17 编译它
所以我知道有时 C++ 可以在某些条件下推导出模板参数,但我想知道为什么在这种情况下它不能编译这段代码。类型 T 似乎没有任何其他选项可以是任何东西,但 int 和 for f绝不是 std::function<void(int)> .

最佳答案

因为 print不是 std::function<void(int)> .并且它可以转换为多个有效类型。
尝试运行

    auto print = [](int x) { std::cout << x; };
std::cout << typeid(print).name()<<"\n";
std::function<void(unsigned __int64)> print_a = std::function<void(unsigned __int64)>(print);
std::cout << typeid(print_a).name() << "\n";
auto print_b = std::function<void(unsigned __int64)>(print);
std::cout << typeid(print_b).name() << "\n";
你会得到
class <lambda_d103cbf184cf5bdcf1494399ee6d564a>
class std::function<void __cdecl(unsigned __int64)>
class std::function<void __cdecl(unsigned __int64)>
其中显示 printlambda ,并且可以转换成多种 std::function<void(T)>喜欢:
    auto print = [](int x) { std::cout << x; };
auto print2 = std::function<void(unsigned __int64)>(print);
auto print3 = std::function<void(unsigned short)>(print);
auto print4 = std::function<void(char)>(print);
一个精确的 std::function<void(int)>可以推导出对象:
std::function<void(int)> print = [](int x) { std::cout << x; };
call_with(print, 42);
42也需要对型用于推导 std::function<void(int)> + int意味着 T=int std::function<void(short)> + short意味着 T=short但是 std::function<void(short)> + int无法推断。
所以你会得到编译错误:
std::function<void(short)> print = [](short x) { std::cout << x; };
call_with(print, 42);
正确的版本是
std::function<void(short)> print = [](short x) { std::cout << x; };
call_with(print, short(42));

关于c++ - 为什么 C++ 编译器不能推导出 lambda 参数的类型?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/65060766/

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