如何定义k维指针的引用?C++语法合规性与实现疑问
问题解答
1. 如何定义k维指针的引用?
你的代码问题核心是引用类型与被引用对象的类型完全不匹配:p3是int***类型的3维指针,但你声明的int &r是int的左值引用,两者类型无法兼容,因此编译器报错。
正确的写法是让引用类型和目标对象的类型严格对齐:
int p = 1, *p1 = &p, **p2 = &p1, ***p3 = &p2; int***& r = p3; // 合法:r是int***类型的左值引用,绑定到p3
对于k维指针,只需要在引用类型前对应加上k个*即可——比如2维指针的引用是int**&,4维指针的引用是int****&,以此类推。
C++标准并没有限制引用指向k维指针,因为指针本身是合法的对象(标准条款[dcl.ref/5]仅禁止引用的引用、引用数组、指向引用的指针,指针的引用不在禁止范围内)。只要引用类型与目标对象类型匹配,这种定义完全符合标准。
2. 为什么int&&&报错,而int&&合法?
拆解两个关键点:
int&&是右值引用,属于C++11及以后标准明确允许的合法引用类型,它不是“引用的引用”,而是一种独立的引用类别,因此完全合法。- 直接写
int&&&本质是试图声明引用的引用(对右值引用的引用),这直接违反了标准条款[dcl.ref/5]的规定:不得存在引用的引用、引用数组以及指向引用的指针。
编译器报错信息提到“not a typedef or a template type argument”,是因为C++的引用折叠规则仅适用于间接场景:比如通过类型别名(typedef/using)、模板参数产生的“引用的引用”,此时编译器会自动折叠为单一引用。例如:
using RRef = int&&; RRef&& r = 10; // 触发引用折叠,最终等价于int&& r = 10;
但直接写int&&&不属于这种合法的间接场景,编译器会直接判定你试图创建非法的引用的引用,因此报错。
总结:直接声明引用时,&的数量只能是1个(左值引用T&)或2个(右值引用T&&);超过2个的直接写法会被视为试图创建引用的引用,违反标准规定。
内容的提问来源于stack exchange,提问作者Joseph D.
相关产品推荐
相关产品推荐

