Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/cplusplus/160.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/design-patterns/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C++ 如何转换;指向指针类型的指针";去康斯特?_C++_Constants_Const Cast - Fatal编程技术网

C++ 如何转换;指向指针类型的指针";去康斯特?

C++ 如何转换;指向指针类型的指针";去康斯特?,c++,constants,const-cast,C++,Constants,Const Cast,使用以下代码 void TestF(const double ** testv){;} void callTest(){ double** test; TestF(test); } 我明白了: 'TestF' : cannot convert parameter 1 from 'double **' to 'const double **' 我不明白为什么。 为什么test不能自动强制转换为constdouble**? 我为什么要明确地这样做?我知道 TestF(const_

使用以下代码

void TestF(const double ** testv){;}
void callTest(){
    double** test;
    TestF(test);
}
我明白了:

'TestF' : cannot convert parameter 1 from 'double **' to 'const double **'
我不明白为什么。 为什么
test
不能自动强制转换为
constdouble**
? 我为什么要明确地这样做?我知道

TestF(const_cast<const double**>(test)) 
TestF(const_cast(test))
使我的代码正确,但我觉得这应该是不必要的


关于const有一些关键的概念是我没有的吗

正确的是,
double**
不能隐式转换为
constdouble**
。不过,它可以转换为
常数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!

因此,如果您的函数不打算修改任何涉及的指针,请将其更改为采用
constdouble*const*
。如果它打算进行修改,您必须确定它所做的所有修改是否安全,从而可以使用
const_cast
,或者您是否真的需要传入
const double**
该语言允许从
double**
隐式转换为
const double*const*
,但不要将其设置为常数双**。您尝试的转换将隐含地违反常量正确性规则,即使它不是立即显而易见的

在[事实标准] C++ FAQ中的例子说明了问题< /P>


基本上,规则是:一旦您在某个间接级别添加了
const
,您就必须将
const
一直添加到右侧的所有间接级别。例如,
int******
不能隐式转换为
int**const***
,但它可以隐式转换为
int**const*const*

这个问题在这里已经讨论了很多次,但这里有一个FAQ条目专门针对这个问题,第一块代码中没有强制转换的可能重复。有一种隐含的转换,各种各样的答案解释了为什么这种转换是不合法的,除了最后一个,就是“一直到右边”?