有人可以解释为什么第二次转换是允许的而第一次转换不是吗?它们都可能允许修改const lvalue ......
double *wPtr;
const double ** wRef = &wPtr;
const double * const * wRef = &wPtr;
谢谢你, 单组
从Comeau中添加编译错误......
int main( int argc, const char* argv[] )
{
double *wPtr;
const double ** wRef = &wPtr;
return 0;
}
Compiling Comeau C/C++ 4.3.10.1 (Oct 6 2008 11:28:09) for ONLINE_EVALUATION_BETA2
Copyright 1988-2008 Comeau Computing. All rights reserved.
MODE:strict errors C++ C++0x_extensions
"ComeauTest.c", line 4: error: a value of type "double **" cannot be used to
initialize an entity of type "const double **"
const double ** wRef = &wPtr;
^
1 error detected in the compilation of "ComeauTest.c".
答案 0 :(得分:2)
因为第二个例子不允许修改一个const值(至少在你没有实际努力的情况下(铸造,这通常是危险的迹象))。我不确定你为什么这么认为,因为你没有提供进一步的解释..
const double * const * wRef = &wPtr;
你必须仔细阅读。它说“wRef是一个指向const的指针,指针指向const”。
您可以修改wRef(指向其他对象)。您不能修改它指向的值(wPtr指针),也不能修改wPtr指向的值。这不会提供修改const lvalue的(普通)途径。
当然,第一个例子显然是危险的,并且不像你期望的那样。
顺便提一下,如果您还没有,请阅读Const correctness chapter of the C++ FAQ。第17节介绍了这个具体案例,但主要是从不允许第一个案例的角度出发,并没有明确地试图描述为什么允许第二个案例。
答案 1 :(得分:0)
所以在一个单词的左边加上'const'这个词是相当误导的。
你的第二个陈述更好地表述为double const * *wRef = &wPtr
基本上,这是一个指向const double的指针。你可以在这里修改左值,因为它的不是 const - 只有指向的双精度才是const。
第二个是double const * const * wRef
- 即指向常量指针的常量指针
可以更改指针指针本身,但是它指向的double必须是const。你不能修改const左值。