Pat*_*oni 3 c++ lambda templates reference c++14
让我深入研究C++ 14泛型lambdas:
#include <iostream>
// g++ -std=c++14
template<typename T>
T incr(T v)
{
return v + 1;
}
int main()
{
float f = 2.0;
int i = 3;
auto selfincr = [] (auto & value)
{
value = incr<std::remove_reference<decltype(value)>>(value); // A
value = incr<decltype(value)>(value); // B
};
selfincr(f);
selfincr(i);
std::cout << "f " << f << ", i " << i << std::endl;
return 0;
}
Run Code Online (Sandbox Code Playgroud)
因为线// B
引起了
从'T'类型的右值开始无效初始化'T&'类型的非const引用
我的直接猜测是删除了引用,所以我添加了一行// A
.但这会产生一个
调用'incr(T&)'没有匹配函数
那我怎么能删除那个引用呢?
那我怎么能删除那个引用呢?
incr<std::remove_reference<decltype(value)>>(value)
,您将指定std::remove_reference<T>
为模板参数,但不是T
(ie decltype(value)
)引用的类型.你想要的应该是什么
value = incr<typename std::remove_reference<decltype(value)>::type>(value); // A
// ~~~~~~~~ ~~~~~~
Run Code Online (Sandbox Code Playgroud)
从C++ 14开始,你可以更简单:
value = incr<std::remove_reference_t<decltype(value)>>(value); // A
// ~~
Run Code Online (Sandbox Code Playgroud)
归档时间: |
|
查看次数: |
421 次 |
最近记录: |