关于c++11的一些特性(3) auto 和 decltype

Tags:

首先看下这3个不同版本的Get函数:

  • 版本1(c++11)
1 template<typename Container, typename Index>
2 auto Get(Container& c, Index i)
3 -> decltype(c[i])
4 {
5     return c[i];
6 }
  • 版本2(c++11)
1 template<typename Container, typename Index>
2 auto Get(Container& c, Index i)
3 {
4     return c[i];
5 }
  • 版本3(c++14)
1 template<typename Container, typename Index>
2 decltype(auto) Get(Container& c, Index i)
3 {
4     return c[i];
5 }

能搞懂这3者的区别吗?如果不能的话,实际编译测试下吧,用下面这段代码即可:

1 int main() {
2     int a = 99;
3     vector<int> arr = { 1,2,3 };
4     decltype(Get(arr, 0)) b = a;
5     Get(arr, 0) = 0;
6     return 0;
7 }

编译结果是:

  • 第一和第三种写法等价,且可以编译运行,decltype(Get(arr, 0))类型是int&
  • 第二种写法编译失败,decltype(Get(arr, 0))类型是int,Get(arr, 0) = 0;非法(不能把右值赋给右值)

也就是说,第二种写法的auto,把返回值推导成了int;而decltype(auto)会推导成int&。

(未经授权禁止转载)
Written on November 7, 2015

博主将十分感谢对本文章的任意金额的打赏^_^