C++中auto&&绑定按值返回临时对象的生命周期及相关疑问
问题解答
1. 输出中1A的含义
1A是GCC编译器对C++类型做名称修饰(Name Mangling)后的内部标识,规则为:前缀数字代表类型名的字符长度,后面跟上类型名本身,这里类名A长度为1,所以修饰后结果为1A。
如果是之前错误写法中出现的typeid(A()),因为A()会被解析为无参数、返回值为A的函数类型,对应的GCC修饰结果就是F1AvE:F代表函数类型、1A是返回值类型、v代表参数列表为空、E代表函数类型结束。
2. a是否会被推导为右值引用
是的,a的类型最终会被推导为A&&右值引用。auto&&属于转发引用,推导规则为:当初始值是右值时,auto会被推导为值本身的类型,最终组合为右值引用;当初始值是左值时,auto会被推导为左值引用,最终组合为左值引用。
此处f()按值返回的A类对象属于纯右值,所以auto被推导为A,a的类型就是A&&。
注意typeid()操作符本身会忽略引用、const/volatile限定符,只会返回引用指向的底层类型,所以无法用typeid的输出判断是否为引用类型,可以用以下静态断言验证:
#include <type_traits> // 两个断言都会编译通过,验证a是右值引用 static_assert(std::is_rvalue_reference_v<decltype(a)>); static_assert(std::is_same_v<decltype(a), A&&>);
3. a是否会在定义后立即失效
不会失效。
C++11及之后的标准明确规定:临时对象的生命周期可以通过绑定到const左值引用或者右值引用延长,临时对象的生命周期会和绑定的引用生命周期保持一致。
此处f()返回的临时A对象绑定到右值引用a上,它的生命周期会和a一致,直到main函数执行结束才会被销毁,不会在定义行之后就失效。
内容的提问来源于stack exchange,提问作者QnA
相关产品推荐
相关产品推荐

