web-dev-qa-db-ja.com

std :: string + =演算子は引数として0を渡すことができません

std::string tmp;
tmp +=0;//compile error:ambiguous overload for 'operator+=' (operand types are 'std::__cxx11::string {aka std::__cxx11::basic_string<char>}' and 'int')
tmp +=1;//ok
tmp += '\0';//ok...expected
tmp +=INT_MAX;//ok
tmp +=int(INT_MAX);//still ok...what?

最初のものは、引数として整数を渡すと主張していますよね?他の人がコンパイルに合格するのはなぜですか?VisualC++とg ++でテストしたところ、上記と同じ結果が得られました。だから私は標準で定義された何かが恋しいと思います。それは何ですか?

37
Leo Lai

問題は、リテラル0がnullポインター定数であるということです。コンパイラは、次のことを意味しているかどうかを知りません。

std::string::operator +=(const char*);  // tmp += "abc";

または

std::string::operator +=(char);         // tmp += 'a';

(より良いコンパイラーはオプションをリストします)。

(あなたが発見したように)回避策は、追加を次のように書くことです:

tmp += '\0';

(文字列バージョンは必要ないと思います-tmp += nullptr;は実行時にUBになります。)

0リテラルは、すべてのポインター型に暗黙的に変換可能です(それぞれのnullポインター定数になります)。したがって、std::strings追加演算子を照合するための2つの同等に有効な変換シーケンスが生成されます。