3

重複の可能性:
char** から const char** への暗黙のキャスト

次のコードがあるとします。

void foo( const char ** buffer );

void bar() 
{
    char * buffer;
    foo( &buffer );
}

foo()関数にパラメーターがある場合、変数をconst char *渡すときにコンパイラーが文句を言わないのはなぜですか? char *しかし、を使用する場合は、 ?char **に変換できません。const char **前者の場合、コンパイラはconst修飾子を追加しますか?

C++ 標準のセクション 4.4 を読みましたが、さらに混乱しました。

4

3 に答える 3

5

はい、暗黙的に a から a に変換することはできませんT **const T **これは、コンパイラが const-ness に違反しないことを保証できなくなったためです。

次のコードを検討してください (まさにこのトピックに関する C FAQ の質問から借用したものです:なぜa を期待する関数に aを渡すことができないのですか ?char **const char ** ):

const char c = 'x';
char *p1;
const char **p2 = &p1;  // 3
*p2 = &c;
*p1 = 'X';              // 5

コンパイラが 3 行目を許可した場合、5 行目でconstオブジェクトへの書き込みが終了します。

于 2012-04-30T12:53:53.713 に答える
2

検討:

char const someText[] = "abcd";

void
foo( char const** buffer )
{
    *buffer = someText;
}

void
bar()
{
    char* buffer;
    foo( &buffer );
    *buffer = 'x';
}

これが合法である場合、介入なしで const オブジェクトを変更することが可能になりますconst_cast。const 性に違反するため、変換は禁止されています。

于 2012-04-30T12:55:42.617 に答える
1

const が適用される間接参照のレベルを混乱させている可能性があります。

Achar**は として記述できますがpointer to a pointer to a character、 aは としてconst char**記述できますpointer to a pointer to a constant character

したがって、これを別の方法で書くと、pointer to A(where A = pointer to character) とpointer to B(where B = pointer to a constant character) があります。

A へのポインターを B へのポインターに代入することはできない (逆もまた同様) ため、A と B は異なる型であることが明らかになりました (希望します)。

于 2012-04-30T12:56:00.243 に答える