gpt4 book ai didi

c++ - invoke_result_t<> 没有将 lambda 与引用参数匹配

转载 作者:行者123 更新时间:2023-11-28 01:24:24 32 4
gpt4 key购买 nike

当类型是右值引用或没有引用时,使用接受模板函数的函数效果很好,但一旦我将其设为左值引用,它就会中断。

请注意,V 目前在这里未使用,但无论是否使用它仍然无法编译。

using namespace std;

template <typename F, typename V = std::invoke_result_t<F, string>>
void func(F f) {
std::vector<string> v = { "a", "b", "c" };
std::for_each(v.begin(), v.end(), f);
}

int main() {
func([](string s) { return s.length(); }); // Good
// func([](string& s) { return s.length(); }); // Bad
func([](const string& s) { return s.length(); }); // Good
}

main.cpp: In function 'int main()':

main.cpp:18:46: error: no matching function for call to 'func(main()::)'

 func([](string& s) { return s.length(); });

^

main.cpp:11:6: note: candidate: 'template void func(F)'

  void func(F f) {

^~~~

main.cpp:11:6: note: template argument deduction/substitution failed:

我不能做类似的事情

std::invoke_result_t<F, string&>

我不能做类似的事情

std::invoke_result_t<F, std::add_lvalue_reference_t<string>>

最后一个是在黑暗中拍摄的。我的模板知识不是那么丰富。我一直在这里和各种博客/谷歌/等上搜索,没有取得太大的成功。

最佳答案

std::invoke_result_t<F, string>

这意味着传递 F 一个 string 右值。如果 F 采用左值引用,则不能。

I can't do something like

 std::invoke_result_t<F, string&>

是的,你可以。如果您想知道使用非常量左值调用它的结果是什么,请执行此操作。

在您的示例代码中使用时,您向它传递了一个左值。 string&& 重载不起作用。

关于c++ - invoke_result_t<> 没有将 lambda 与引用参数匹配,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/54604082/

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