为何引用的底层const在auto类型推导中未被保留?
C++中auto推导const与引用的行为说明
当用auto推导变量类型时,顶层const会被自动忽略,示例:
const int i = 0; // i 是顶层const(const修饰i本身) auto j = i; // j 的类型是int,顶层const被忽略
但底层const不会被忽略,比如指针场景:
const int* ptr = nullptr; // ptr 是底层const(const修饰指针指向的对象) auto ptr2 = ptr; // ptr2 的类型为const int*,底层const被保留
不过存在特殊情况:当基于底层const引用用auto推导时,不仅引用属性没被推导,连const也“消失”了:
int var; const int& ref = var; // ref 是带底层const的引用 auto ref2 = ref; // ref2 的类型是int!之前误以为是int&,实际错误
原因说明
auto的类型推导逻辑和模板类型推导一致:当用引用类型的表达式初始化auto定义的变量时,auto会自动忽略引用属性,直接推导引用所绑定对象的实际类型。在上面的例子里,ref是const int&,但它绑定的是普通int变量var,用ref初始化ref2本质是做值拷贝,auto推导的是被引用对象的类型(int),因此既不带引用,也不带const。
如果希望auto推导出引用类型并保留const,需要显式在auto后添加&,比如auto& ref2 = ref;,此时ref2的类型就是const int&。
内容的提问来源于stack exchange,提问作者Madhu M N
相关产品推荐
相关产品推荐

