9
std::string x(x);

これは私のコンパイラで非常にひどくクラッシュします。this != &thatこれは、自分のコピーコンストラクターでテストする必要があることを意味しますか、それとも、これほど愚かなクライアントはいないと想定できますか?

4

3 に答える 3

9

ひどくクラッシュしようとするコードに対してテストするべきではありません。ヌル参照を参照してください。それは言う

「null以外のポインターが有効であると想定する必要があるのと同じように、参照が有効であると想定する必要があります。他のプログラマーを信頼する必要があります。」

補完したい

...コピーのソースが有効であると想定する必要があります。

ケースを「修正」した場合、これをどうするか。

string x = string(x);
于 2010-03-27T11:41:40.997 に答える
6

それ自体で何かを初期化することは未定義の動作です。これは、一度呼び出されると、後でそれを検出することさえできないことを意味する場合もあります。コンパイラがそれを検出し、それにもかかわらず、コピーコンストラクタの呼び出しではなく、鼻の悪魔のアセンブリを生成するとしますか?

実際には、クライアントはそれほど愚かではないと想定できます。クライアントがそうである場合は、それをデバッグして把握するのが彼らの仕事です。

于 2010-03-27T11:49:15.240 に答える
2

そのコードは標準に従って正しくなく、それをチェックすることは意味がありません。起こり得る最善のことは、ユーザーがコードを修正できるように迅速に失敗することです。

于 2010-03-27T11:42:07.263 に答える