18

次のコードで

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に関するいくつかの重要な概念はありますか?

4

2 に答える 2

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 *

于 2013-11-11T15:52:38.110 に答える
11

double **aを暗黙的に a に変換できないことは正しいですconst double **。ただし、に変換できます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!

したがって、関数が関連するポインターを変更するつもりがない場合は、const double * const *. 変更を行うつもりなら、それが行うすべての変更が安全であり、したがってconst_cast使用できるかどうか、または実際にconst double **.

于 2013-11-11T15:51:31.857 に答える