How to convert quot;pointer to pointer typequot; to const?(如何将“指针转换为指针类型常量?)
问题描述
用下面的代码
void TestF(const double ** testv){;}
void callTest(){
double** test;
TestF(test);
}
我明白了:
'TestF' : cannot convert parameter 1 from 'double **' to 'const double **'
我不明白为什么.为什么 test
不能被无声地转换为 const double**
?我为什么要明确地这样做?我知道
I cannot understand why.
Why test
cannot be silently casted to const double**
?
Why should I do it explicitly? I know that
TestF(const_cast<const double**>(test))
使我的代码正确,但我觉得这应该是不必要的.
makes my code correct, but I feel this should be unnecessary.
我缺少一些关于 const 的关键概念吗?
Are there some key concepts about const that I'm missing?
推荐答案
语言允许从 double **
到 const double *const *
的隐式转换,但不能到const double **
.您尝试的转换将隐含违反 const 正确性规则,即使它不是立即显而易见的.
The language allows implicit conversion from double **
to const double *const *
, but not to const double **
. The conversion you attempt would implicitly violate the rules of const correctness, even though it is not immediately obvious.
[de-facto standard] C++ FAQ 中的示例说明了这个问题
The example in the [de-facto standard] C++ FAQ illustrates the issue
https://isocpp.org/wiki/faq/const-correctness#constptrptr-conversion
基本上,规则是:在某个间接级别添加 const
后,您必须将 const
一直添加到所有间接级别.例如 int *****
不能隐式转换为 int **const ***
,但可以隐式转换为 int **const*const *const *
Basically, the rule is: once you add const
at some level of indirection, you have to add const
to all levels of indirection all the way to the right. For example, int *****
cannot be implicitly converted to int **const ***
, but it can be implicitly converted to int **const *const *const *
这篇关于如何将“指针转换为指针类型"常量?的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持编程学习网!
本文标题为:如何将“指针转换为指针类型"常量?


基础教程推荐
- 如何在 C++ 中处理或避免堆栈溢出 2022-01-01
- 运算符重载的基本规则和习语是什么? 2022-10-31
- C++,'if' 表达式中的变量声明 2021-01-01
- 什么是T&&(双与号)在 C++11 中是什么意思? 2022-11-04
- C++ 程序在执行 std::string 分配时总是崩溃 2022-01-01
- 设计字符串本地化的最佳方法 2022-01-01
- 您如何将 CreateThread 用于属于类成员的函数? 2021-01-01
- 调用std::Package_TASK::Get_Future()时可能出现争用情况 2022-12-17
- 如何定义双括号/双迭代器运算符,类似于向量的向量? 2022-01-01
- C++ 标准:取消引用 NULL 指针以获取引用? 2021-01-01