web-dev-qa-db-ja.com

const char * const&= "hello"をコンパイルできるのはなぜですか?

私は本からコードスニペットを読んでおり、これを見つけます:

const char* const & a = "hello"; //can compile 
const char*& a = "hello"; //cannot

私が知っているのは、参照を初期化するときに、配列からポインターへの変換が行われないことです。

const char* const &const pointerへの参照、ポインターはconst charを指します。

const char*&pointerへの参照、ポインターはconst charを指します。

それでは、ポインタがconstであることを示す余分なconstを追加してコンパイルできるのはなぜですか?

52
Rick

それは本質的にこの式に固執しています

T const & a = something_convertible_to_T;

Tはconst char*です。最初のケースでは、一時ポインターを具体化し、リテラルのアドレスを割り当て、それ自体を参照にバインドできます。 2番目の場合、左辺値参照はconstではないため、発生しません。同じものの別の例

const char* && a = "hello"; // rvalue ref makes a no into a yes.

これで、一時ポインターが右辺値参照にバインドされました。

37
StoryTeller