理解现代C++ (五) auto类型推演(最全版本,一文学会)

auto 类型推演脱胎于模版函数的类型推演,它们的能力几乎等价(除了初始化列表的情况)。 这也就意味着,其实在 C++11 之前,C++ 早就具备了 auto 的能力,只是没有从语法上允许而已。

auto 的语意

和直觉不同的是,对于任意表达式:auto v = exprv 的类型并不总是和 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 语意。因而,等号右边的表达式本身类型是引用,并不影响 等号左侧对象本身不是引用;同样的,等号右边表达式本身的 constnesscopy/move 后,并不会影响新定义变量 的 constness

其推演语意,完全等价于:

template <typename T>
void f
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值