gpt4 book ai didi

C++ 资格转换 - constness

转载 作者:太空狗 更新时间:2023-10-29 21:50:37 25 4
gpt4 key购买 nike

有人可以解释为什么允许第二次转换而不允许第一次转换吗?它们都可能允许修改 const 左值...

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".

最佳答案

因为第二个示例不允许允许修改 const 左值(至少在您没有实际努力的情况下(强制转换,这本身通常是危险的标志))。我不确定你为什么这么认为,因为你没有提供进一步的解释..

const double * const * wRef = &wPtr;

您必须非常仔细地阅读此内容。它说“wRef 是一个指向 const 的指针,指向一个 double,它是 const”。

您可以修改 wRef(指向不同的对象)。您不能修改它指向的值(wPtr 指针),也不能修改 wPtr 指向的值。这不提供修改 const 左值的(普通)途径。

当然,如您所料,第一个示例显然是危险的并且是不允许的。

顺便说一句,你应该通读 Const correctness chapter of the C++ FAQ如果你还没有。第 17 节讨论了这个具体案例,虽然主要是从为什么不允许第一个的角度出发,但没有明确尝试描述为什么允许第二个。

关于C++ 资格转换 - constness,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/5774617/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com