「戻り値の最適化」によって未定義の動作が発生することはありますか?

StackOverflow https://stackoverflow.com/questions/2323940

  •  22-09-2019
  •  | 
  •  

質問

読む これ 次の質問に対する回答者の 1 人が指摘した Wikipedia の記事:

C++ コピー コンストラクター、一時ファイル、およびコピー セマンティクス

この線に行き当たりました

コンパイラおよびコンパイラの設定に応じて、結果のプログラムでは次の出力のいずれかが表示される場合があります。

これは未定義の動作に当てはまらないでしょうか?記事がこう言っているのは知っています Depending on the compiler and settings でもこれだけはクリアしたい。

役に立ちましたか?

解決

いいえ、それは未定義の動作ではありません。未定義の動作は(ほとんどは:「行動、このような誤プログラム構築物またはこの規格は何の要件を課していないそのため、誤ったデータの使用時に発生する可能性があるとして」)標準で特定の定義を持っているこの場合、動作は、指定されていませんではなく、未定義ます。

違いは、未定義の動作を使って何のいずれかの実行が(すなわち、何が起こることができます)あなたのプログラムのすべての動作は未定義なることです。コピーコンストラクタの実行のいずれかを、またはそれはしていません。

:この特定、不特定の動作では、二つの一方のみが発生する可能性があります。

他のヒント

はありません。動作は、リスト上の出力のうちの一つになるように定義されます。未定義の動作は、悪魔があなたの鼻の飛び出し含まれます。

を参照してください:鼻悪魔

未定義の動作 とはかなり異なります 実装定義の動作, 、これがここに関係するものです。

は、未定義で何を意味するかによって異なります。定義の標準文書の使用によって - 私は他の人がここで言っているものと信じています。しかし、私はまた、誰かが言うとき、私は未定義の動作と考える「のいずれか、このまたはそれは、私はこれを言っていないよ」ということを知っています。

それはエラーが発生することはありませんように、しかし、大したことではありません。あなたが特定のメソッドを定義すると、あなたは、特定の規則に従ってそれらを定義することが期待されている - それはあなた、コンパイラとあなたのコードを使用して維持する人々の間の暗黙の契約のようなものだ。

この場合、あなたはコピーコンストラクトなどまたは最適化された動作を取得するかどうか、効果が同じであることが期待される - 呼び出し側が希望値を受け取ります。あなたのコピーコンストラクタが印刷された場合に「Hello World!」をまたは障害が契約を破るためのあなたのであるので、それは、コンストラクタの期待される動作を実施していない、その他の不適切な副作用を持っています。

ライセンス: CC-BY-SA帰属
所属していません StackOverflow
scroll top