auto 类型推演脱胎于模版函数的类型推演,它们的能力几乎等价(除了初始化列表的情况)。 这也就意味着,其实在 C++11 之前,C++ 早就具备了 auto 的能力,只是没有从语法上允许而已。
auto 的语意
和直觉不同的是,对于任意表达式:auto v = expr ,v 的类型并不总是和 expr 所返回的类型一致。
首先,auto 不可能是一个 引用 ,无论是 左值引用 ,还是 右值引用 ,所以,如果 expr 返回类型里 包含任何引用,都会被舍弃。比如:
Foo foo{
1};
Foo& ref = foo;
Foo&& rref = Foo{
2};
Foo& getRef();
Foo&& getRref();
auto v1 = ref; // v1 type: Foo
auto v2 = rref; // v2 type: Foo
auto v3 = getRef(); // v3 type: Foo
auto v4 = getRref(); // v4 type: Foo
其次,所有对值所修饰的 const 都会被丢弃。 比如:
const Foo foo{
1};
const Foo& ref = foo;
const Foo&& rref = Foo{
2};
const Foo* const p = &foo;
auto v1 = foo; // Foo
auto v2 = ref; // Foo
auto v3 = rref; // Foo
auto v4 = p; // const Foo*
究其原因,是因为这种直接给出 auto 的写法,是一种 copy/move 语意。因而,等号右边的表达式本身类型是引用,并不影响 等号左侧对象本身不是引用;同样的,等号右边表达式本身的 constness ,copy/move 后,并不会影响新定义变量 的 constness 。
其推演语意,完全等价于:
template <typename T>
void f

最低0.47元/天 解锁文章
17万+

被折叠的 条评论
为什么被折叠?



