我很清楚const pointer to pointer problem,我以为我知道发生了什么,但男孩我错了。我想实现这个目标:
int* var[4];
const int* const (&refArray)[4] = var; //compile error
是的,我想保留数组而不是转换为指针,是的,我实际上在我的代码中遇到了这个问题。所以我接着调查了我能做什么,不能做什么,不久我意识到我不知道发生了什么:
int* var[4];
const int* const * ptr = var; //allowed
const int* const * (&refPtr_indirect) = ptr; //allowed
const int* const * (&refPtr) = var; //error
const int* const * const (&constRefPtr) = var; //allowed
int* const (&refArray)[4] = var; //allowed
const int* const (&refArray)[4] = var; //error
我能理解前四个,但最后两个对我来说完全没有意义。我确实看到第三个版本可以工作,我可以删除reference
,但我真的希望保留数组类型。
感谢任何帮助,但希望它可以包含为什么规则背后的原因。
答案 0 :(得分:1)
你有一个指向(非常数)int
的四个指针的数组。要将此视为指向const int
的四个指针的数组,您需要执行类型双关语。 int [4]
和const int [4]
类型不同,对一个类型的引用不能引用另一个类型。
您可以做的最好的事情是对整个数组进行持续引用。在这种复杂情况下,最好使用某些类型名称来实现可管理性:
typedef int* TheArray[4];
TheArray var;
const TheArray &ref = var;
这给你这个:
ref[0]; // OK
ref[0] = nullptr; // error
*ref[0]; // OK
*ref[0] = 42; // OK
你的第五个版本是相同的,只是没有类型名称
int * const (&refArray) [4] = var;
对int
的四个指针的常量数组的引用。 (常量数组与常量元素数组相同)。
第六个版本不可行,正如我在顶部所说 - 数组元素的类型不同,所以没有引用可以引用它们。
答案 1 :(得分:0)
Angew得到了一些观点,但我认为问题在于:
您无法将int*[n]
转换为const int*[n]
。
所以这是允许的:
int a[4];
const int (&b)[4] = a;
但以下不是:
int *c[4];
const int *(&d)[4] = c;