C ++资格认证转换 - 常量

时间:2011-04-25 02:11:20

标签: c++

有人可以解释为什么第二次转换是允许的而第一次转换不是吗?它们都可能允许修改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".

2 个答案:

答案 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左值。