3

文字列がstring fooあり、 と書いた場合、文字列foo += 27に何が追加されますか? ASCII 16 進値 0x27 または 0x1b の文字ですか?

また、試してみるfoo += 0と、文字列と int を使用した += 演算子のあいまいなオーバーロードを示すコンパイル エラーが発生します。ゼロ以外の数値を追加してもコンパイル エラーが発生しないのに、ゼロを追加するとエラーが発生するのはなぜですか?

最初int z = 0に、次に と言うとfoo += z、エラーは発生しません。違いの原因は何ですか?

4

2 に答える 2

2

コンパイラがorfoo + 27と同じものを扱うと書いたとき、私はもともと誤りを犯しました。(式を記述するには、どちらの方法も適しています。) 文字定数の型はC にありますが、C++ にあります。ただし、との間の暗黙的な変換により、さらに具体的な が存在しないため、コンパイラは最終的に に変換します。foo + '\033'foo + '\x1b'intcharcharintstd::basic_string<T>::operator+(int)27'\x1b'

C++ はもともと0ヌル ポインターのキーワードとして使用されていたため、 (より簡潔に言うと)foo + 0または. 1 つ目は未定義の動作であり、論理的に意味がありませんが、コンパイラは、それが別の意味であったに違いないと推測しません。foo + static_cast<const char*>(0)foo + nullptrfoo + '\0'

于 2018-02-18T04:05:19.103 に答える