11

C++ コードで作業しているときに、次の型の間違いを数回見ました。

QString str = str.toUpper();

これはかなり簡単に間違いを犯す可能性がありますが、コンパイルして実行します (クラッシュする場合もあれば、クラッシュしない場合もあります)。あなたが実際にやりたいと思うような状況は見当たりません。

一部のテストでは、デフォルトのコンストラクターではなくコピー コンストラクターが呼び出され、オブジェクトがコピー コンストラクター内から自身を与えられていることが明らかになりました。

これがコンパイラ エラーや警告ではない理由を説明できる人はいますか?

4

2 に答える 2

7

str技術的には、等号に到達するとオブジェクトが定義されるため、その時点で使用できます。

エラーは、オブジェクトをそれ自体で初期化しようとしたときに発生し、コンパイラはそれについて警告することができます (検出できる場合)。ただし、すべての場合に検出できるわけではないため、コンパイラは必要ありません。

たとえば、パラメーターの値を使用しないint x = f(x);場合は完全に正しいです。int f(const int&)関数本体をまだ見ていない場合、コンパイラはどのようにそれを知るのでしょうか?

于 2011-10-10T20:59:41.990 に答える
-4

次と同等であるため、エラーや警告はありません。

QString str;
str = str.toUpper();

と同じように

QString str = "aaa";

と同じです

QString str;
str = "aaa";

同じステートメントでこれを行うには、コンパイルされないコンストラクターを使用する必要があります。

QString str(str.toUpper());

と同じように:

QString str("aaa");

と同等ではありません

QString str;
str = "aaa";
于 2011-10-10T20:36:42.867 に答える