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 ++でテストしたところ、上記と同じ結果が得られました。だから私は標準で定義された何かが恋しいと思います。それは何ですか?
問題は、リテラル0がnullポインター定数であるということです。コンパイラは、次のことを意味しているかどうかを知りません。
std::string::operator +=(const char*); // tmp += "abc";
または
std::string::operator +=(char); // tmp += 'a';
(より良いコンパイラーはオプションをリストします)。
(あなたが発見したように)回避策は、追加を次のように書くことです:
tmp += '\0';
(文字列バージョンは必要ないと思います-tmp += nullptr;
は実行時にUBになります。)
0
リテラルは、すべてのポインター型に暗黙的に変換可能です(それぞれのnullポインター定数になります)。したがって、std::string
s追加演算子を照合するための2つの同等に有効な変換シーケンスが生成されます。