2016-06-27 5 views
3

これらのすべての行は、コンパイルして実行、出力に印刷された何も:コンパイラエラーなしでIntにStringを割り当てることができますか?

std::string ss{6}; 
    ss=7; 
    std::cout << "ss " << ss << "\n"; 

が、私はそれを文字列に整数を強制することができますことをお勧めstd::stringのための任意の参照コンストラクタを見ていないので、なぜコンパイラではないがありません文句?

+0

[代入演算子のドキュメント](http://en.cppreference.com/w/cpp/string/basic_string/operator%3D)が役立つことがあります。 – WhozCraig

+0

これまでの回答は、 'initialize_list 'を取ってコンストラクタを呼び出す 'std :: string ss {6};'については言及していませんでした。 –

+0

'basic_string&operator =(CharT ch);' - 待って...何?どのような愚かな過負荷。 –

答えて

5

「問題は」std::stringcharから割り当て可能であるとintcharに暗黙的に変換されるということです。

(4)std::basic_string::operator=ポイントを見てみましょう:M.M's commentに述べたように

basic_string& operator=(CharT ch); 

EDIT

std::string ss{6};initializer_list<char>を取るコンストラクタを呼び出し(std::basic_string::basic_stringポイント(9)を参照してください)...と問題が再現されます。

+2

うわー、なぜタイプ間の暗黙的な変換を許さないことによって、これらのエラーを取り除く言語がいくつかあるのは間違いありません。 –

+3

@JXB:公正であるために、ここでのより大きな問題は、Cに文字型がないことです。代わりに文字の数値コードを整数型で格納します。 – Hurkyl

1

それはとてもintが暗黙的にcharに変換されている

basic_string& operator=(CharT ch); 

です。

65を割り当ててみてください。印刷A

1

ss=7はコンストラクタを呼び出すのではなく、代入演算子=()を呼び出します。

std::stringcharを取る代入演算子を持っていない、とあなたの値7は、その後string& operator= (char c);がその値のために呼ばれ、charに変換されます。文字列にはASCII BELL文字が含まれます。

詳細はhereを参照してください。

関連する問題