【发布时间】:2019-02-09 07:14:26
【问题描述】:
当类型是右值引用或没有引用时,使用接受模板化函数的函数效果很好,但一旦我将其设为左值引用,它就会中断。
请注意,这里目前没有使用 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:在函数'int main()'中:
main.cpp:18:46: 错误:没有匹配函数调用 'func(main()::)'
func([](string& s) { return s.length(); }); ^main.cpp:11:6: 注意:候选:'template void func(F)'
void func(F f) { ^~~~main.cpp:11:6: 注意:模板参数推导/替换失败:
我做不到
std::invoke_result_t<F, string&>
而我做不到
std::invoke_result_t<F, std::add_lvalue_reference_t<string>>
最后一个是在黑暗中拍摄的。我的模板知识不是很好。我一直在这里和各种博客/谷歌/等上搜索,但没有取得太大成功。
【问题讨论】:
-
要捕获所有情况,您可以尝试使用
std::invoke_result_t<F, string const &>