- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
当类型是右值引用或没有引用时,使用接受模板函数的函数效果很好,但一旦我将其设为左值引用,它就会中断。
请注意,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/
我正在创建一个函数,它接受一个可迭代对象(一个容器),它的开始和结束方法返回迭代器,其解引用可以通过传递的 lambda 进行修改。听起来很复杂,但我正在尝试做一些像 Python super 整洁的
我正在尝试实现一个有 flavor 的 for_each(),当传入的函数返回 false 时它将停止迭代。如果传入的函数不返回 bool 值,则作为 std::for_each() 运行。 我在获取
当类型是右值引用或没有引用时,使用接受模板函数的函数效果很好,但一旦我将其设为左值引用,它就会中断。 请注意,V 目前在这里未使用,但无论是否使用它仍然无法编译。 using namespace st
我有一个类似容器的类,其方法类似于 std::apply。我想用 const 限定符重载这个方法,但是当我尝试用通用 lambda 调用这个方法时,我从 std::invoke_result_t 的实
我是一名优秀的程序员,十分优秀!