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

Tags:

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

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

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

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

编译结果是:

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

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

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

写作不易,您的支持是我写作的动力!