首先看下这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
写作不易,您的支持是我写作的动力!