作者热门文章
- mongodb - 在 MongoDB mapreduce 中,如何展平值对象?
- javascript - 对象传播与 Object.assign
- html - 输入类型 ="submit"Vs 按钮标签它们可以互换吗?
- sql - 使用 MongoDB 而不是 MS SQL Server 的优缺点
用下面的代码
void TestF(const double ** testv){;}
void callTest(){
double** test;
TestF(test);
}
我明白了:
'TestF' : cannot convert parameter 1 from 'double **' to 'const double **'
我不明白为什么。为什么 test
不能被无声地转换为 const double**
?我为什么要明确地这样做?我知道
TestF(const_cast<const double**>(test))
使我的代码正确,但我觉得这应该是不必要的。
我缺少一些关于 const 的关键概念吗?
最佳答案
该语言允许从 double **
到 const double *const *
的隐式转换,但不能到 const double **
。您尝试的转换将隐含违反 const 正确性规则,即使它不是立即显而易见的。
[de-facto standard] C++ FAQ 中的示例说明了这个问题
https://isocpp.org/wiki/faq/const-correctness#constptrptr-conversion
基本上,规则是:在某个间接级别添加 const
后,您必须将 const
添加到所有间接级别一直到右侧。例如 int *****
不能隐式转换为 int **const ***
,但可以隐式转换为 int **const *const *const *
关于c++ - 如何将 "pointer to pointer type"转换为 const?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/19910296/
我是一名优秀的程序员,十分优秀!