21

今日、プログラムで、unsigned integer を std::string にうっかり割り当ててしまった興味深い状況に遭遇しました。VisualStudio C++ コンパイラは警告やエラーを表示しませんでしたが、プロジェクトを実行したときにたまたまバグに気付き、文字列にジャンク文字が表示されました。

コードは次のようになります。

std::string my_string("");
unsigned int my_number = 1234;
my_string = my_number;

次のコードも正常にコンパイルされます。

std::string my_string("");
unsigned int my_number = 1234;
my_string.operator=(my_number);

次の場合はエラーになります。

unsigned int my_number = 1234;
std::string my_string(my_number);

何が起こっている?コンパイラが最後のコード ブロックでビルドを停止するのに、最初の 2 つのコード ブロックはビルドするのはなぜですか?

4

4 に答える 4

27

string は から割り当て可能でcharあり、int暗黙的に に変換できるためcharです。

于 2009-07-24T13:39:36.700 に答える
23

std::string クラスには、次の代入演算子が定義されています。

string& operator=( char ch );

unsigned intこの演算子は、から への暗黙的な変換によって呼び出されcharます。

3 番目のケースでは、明示的なコンストラクターを使用して をインスタンス化してstd::stringいます。使用可能なコンストラクターはいずれも を受け入れることができませんunsigned int。または、からの暗黙的な変換を使用しますunsigned int

string();
string( const string& s );
string( size_type length, const char& ch );
string( const char* str );
string( const char* str, size_type length );
string( const string& str, size_type index, size_type length );
string( input_iterator start, input_iterator end );
于 2009-07-24T13:44:02.063 に答える
0

それは間違いなく operator=(char ch) 呼び出しです-私のデバッガーはそれに踏み込みました。そして、私の MS VS 2005 は、エラーなしで次のようにコンパイルされます。

std::string my_string("");
unsigned int my_number = 1234;
my_string = my_number;
my_string.operator=(my_number);
于 2009-07-24T13:47:01.200 に答える
-1

1 番目と 3 番目の状況については、次のように説明できます。

my_string = 1234;

これは、string が operator=(char) をオーバーライドしたために機能します。実際には、(データ オーバーフローを伴う) 文字を文字列に割り当てています。2 番目のケースでコンパイル エラーが発生する理由がわかりません。GCCでコードを試してみましたが、コンパイルされます。

std::string my_string(1234);

char または int 引数を取る文字列コンストラクターがないため、機能しません。

于 2009-07-24T14:05:14.437 に答える