Item3:理解 decltype 类型推导
个人认为原著写的非常晦涩难懂,所以精简如下:
decltype用于告知名字或表达式的类型:
1 | const int i = 0; // decltype(i) 是 const int |
使用场景:当函数的返回类型依赖于参数类型时:我们不知道用户会传什么容器进来
1 | // C++11的写法(尾置返回类型) |
我们希望这个函数返回容器元素,类型要和容器[]操作符返回的一致。但不同的容器,operator[]返回的类型可能不同:
vector<int>的operator[]返回int&vector<bool>的operator[]返回一个特殊对象
和auto的区别:auto会去掉引用,decltype原样返回表达式的类型(引用/const会保留)。
decltype(auto):这是C++14的特性,意思是:
- 用
auto来自动类型推导 - 但用
decltype的规则来推导(保留引用)
可以理解为 保留引用/const的auto。
一个小陷阱:
1 | // 括号的微妙影响 |
总结
- 绝大多数情况下,
decltype会得出变量或表达式的类型而不作任何修改。 - 对于类型为
T的左值表达式,除非该表达式仅有一个名字,decltype总是得出类型T&。 - C++14 支持
decltype(auto),和auto一样,它会从其初始化表达式出发来。
本博客所有文章除特别声明外,均采用 CC BY-NC-SA 4.0 许可协议。转载请注明来源 肖恩的博客!
评论
