c++ - std::remove_reference 有什么意义
问题描述
让我深入了解 C++14 通用 lambda:
#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;
}
由于线// B
导致
从“T”类型的右值初始化“T&”类型的非常量引用无效</p>
我的直接猜测是删除了引用,所以我添加了 line // A
。但这会产生一个
'incr(T&)'的调用没有匹配的函数</p>
那么我怎么能删除那个引用呢?
解决方案
那么我怎么能删除那个引用呢?
incr<std::remove_reference<decltype(value)>>(value)
,您指定为模板参数,而不是(ie )std::remove_reference<T>
引用的类型。你想要的应该是T
decltype(value)
value = incr<typename std::remove_reference<decltype(value)>::type>(value); // A
// ~~~~~~~~ ~~~~~~
从 C++14 开始,你可以让它更简单:
value = incr<std::remove_reference_t<decltype(value)>>(value); // A
// ~~
推荐阅读
- c - Handle logout and sorting in an array of socket threads
- arrays - How can I extract from an array of json object that is saved as text?
- javascript - AWS Amplify Modular Imports with Vue
- docker - Docker - transfer image of database with its content
- javascript - 获取目标元素之后的所有元素id
- ios - .tag 在 Swift 4 中尝试 segue 3 个可能的值时不起作用
- sql - SQLite 慢选查询
- spring-boot - 无法解析值“${auth0.audience}”中的占位符“auth0.audience”
- angular - Angular mat-table 未显示数据,已修复,但不确定修复的原因
- javascript - 错误的(很可能)这个上下文