jim*_*iki 17 c++ const const-cast
使用以下代码
void TestF(const double ** testv){;}
void callTest(){
double** test;
TestF(test);
}
Run Code Online (Sandbox Code Playgroud)
我明白了:
'TestF' : cannot convert parameter 1 from 'double **' to 'const double **'
Run Code Online (Sandbox Code Playgroud)
我不明白为什么.为什么test
不能默默地投入const double**
?我为什么要明确地这样做?我知道
TestF(const_cast<const double**>(test))
Run Code Online (Sandbox Code Playgroud)
使我的代码正确,但我觉得这应该是不必要的.
是否有一些关于const的关键概念我不知道了?
AnT*_*AnT 13
该语言允许隐式转换double **
为const double *const *
,但不允许const double **
.您尝试的转换将隐含地违反const正确性的规则,即使它不是立即显而易见的.
[事实上的标准] C++ FAQ中的示例说明了这个问题
https://isocpp.org/wiki/faq/const-correctness#constptrptr-conversion
基本上,规则是:一旦你const
在某个间接级别添加,你必须添加const
到所有级别的间接一直到右边.例如,int *****
不能隐式转换为int **const ***
,但可以隐式转换为int **const *const *const *
Rei*_*ica 11
一个double **
不能隐式转换为a 是正确的const double **
.但它可以转换为a const double * const *
.
想象一下这种情况:
const double cd = 7.0;
double d = 4.0;
double *pd = &d;
double **ppd = &pd;
const double **ppCd = ppd; //this is illegal, but if it were possible:
*ppCd = &cd; //now *ppCd, which is also *ppd, which is pd, points to cd
*pd = 3.14; // pd now points to cd and thus modifies a const value!
Run Code Online (Sandbox Code Playgroud)
因此,如果您的函数不打算修改任何涉及的指针,请将其更改为a const double * const *
.如果它打算进行修改,你必须决定它所做的所有修改是否安全,因此const_cast
可以使用,或者你是否真的需要传入const double **
.
归档时间: |
|
查看次数: |
2458 次 |
最近记录: |