2016-08-19 7 views
1
#include <iostream> 
int foo(const char* keke) { 
    std::cout << keke; 
    return 0; 
} 
int main() 
{ 
    char* keke = new char(10); 
    char* const haha = keke; 
    return foo(haha); 
} 

上記のコードをコンパイルする際に、何もエラーや警告が表示されないのはなぜですか?C++のconstnessに関する暗黙の変換

hahaのタイプはchar* constであり、fooのタイプはconst char*の引数のみです。 char* const暗黙にconst char*に変換できますか?

+0

私は暗黙の変換について質問しているので、質問を再開しました。違いはありません。 – songyuanyao

答えて

4

はい。これは、(暗黙的な変換の1つ)qualification conversionsと呼ばれる:

(強調鉱山)

型ポインタのprvalue CV修飾型TがよりCV修飾にprvalueポインタに変換することが可能にと同じタイプT(言い換えれば、定数とボラティリティを追加できます)。

は「詳細は、」CV修飾は

未修飾型へのポインタをCONSTへのポインタに変換することができることを意味します。
...

それはchar*が暗黙的にconst char*に変換することができ意味。ポインタ自体に

const修飾子はここでは関係ありません、パラメータkeke自体が値によって渡されることが宣言され、それは引数がhaha(; char* constすなわちconstポインタ)からコピーされるように罰金です。

+0

関数呼び出しに暗黙の変換が含まれていますか? '値渡し'の 'それは良いです '... – Jichao

+0

@Jichaoあなたは' char * const'から 'char *'までを意味しましたか?いいえ。 – songyuanyao

+0

関数呼び出しでは、 'char * const'と' char * 'に対して型のマッチングを行う必要はありませんか? – Jichao