请考虑以下代码:
void func1(const double& x) {
x = 1.2; //compilation error! (assignment of read-only reference)
}
void func2(const double* x) {
*x = 1.3; //compilation error! (assignment of read-only location)
}
void func3(const double*& x) {
*x = 1.4; //compilation error! (assignment of read-only location)
}
int main()
{
double a = 1.1;
func1(a);
double *y = &a;
func2(y);
func3(y); //compilation error! (invalid initialization of reference of type 'const double*&' from expression of type 'double*')
return 0;
}
在这里,我的理解是func1()
引用了一个double,而func2()
获取了一个指向double的指针。在这两种情况下,const
关键字表示该函数不能修改double的值。因此,我按预期得到了编译错误。
但func3()
又发生了什么?我似乎找不到这个输入参数类型意味着解释编译错误的解释。我认为const double*& x
表示"对double*
的引用,无法修改"。但这似乎是错误的解释:我无法发送double*
(但我可以发送const double*
)我可以修改指针指向的地址(但我CAN' T修改指针所指向的double
。
我想我的困惑来自对const
关键字"附加"的误解。 :到&
?到double*
? const double*& x
的解释是什么可以消除我的困惑?
编辑:此问题与建议的副本不同,因为它在很大程度上与如何解释const
关键字"附加到"。
答案 0 :(得分:4)
const double*&
是对指向const double的指针的引用。所以*x
是一个const double,你不能这样分配。此处const
附有double
。
你可能想要使用double* const
(这是一个指向[非const] double的const指针)或double* const&
(它是对[non-const] double的const指针的引用)。
答案 1 :(得分:3)
const double*& x
表示x
是对指向const double的指针的引用,这意味着无法修改对象(即const
是附加到double
的类型限定符,在这种情况下不是指针对象本身)
答案 2 :(得分:2)
const double*& x
表示对const double*
的非const引用。
当您传递double*
时,需要将其转换为const double*
,这是一个临时变量,无法绑定到非const引用,这是{为什么编译器抱怨。
BTW:const double* const & x
是const double*
的常量引用。