2015-10-22 9 views
8

は、関数が呼び出されること空のbodyを持つIf-StatementがC++で評価されることが保証されていますか?

if(doSomething()) {} 

ん「C++標準」保証(追記として、私の好みのコーディングスタイルではない、)この文を考えると? (それの戻り値は、実行パスには影響しませんので、コンパイラ はショートカット評価の考え方に従うと、すぐにそれを最適化することができる。)

+2

はい、標準ではそれが保証されており、オプティマイザはセマンティック効果を変更できません。 –

+0

戻り値を明示的に破棄するには '(void)doSomething();'と書くだけです。 – Useless

答えて

8

が関与していて、短絡演算子もありませんので、関数が呼び出されることが保証されています副作用を取り除かずに最適化することができない場合C++ 11標準を引用:

[...]準拠 実装が以下 を説明するように、抽象機械の(のみ)観察可能な挙動をエミュレートするために必要とされます。

この規定は時々「として、もし」ルール[...]それは、その値が使用されていないことを推測していることができた場合、実際の実装は表現 の一部を評価する必要はないと呼ばれていますプログラムの観察可能な動作に影響を与える副作用は発生しません。

ので、

int doSomething() { return 1; } 

のようなものを離れて最適化されるかもしれませんが、

int doSomething() { std::cout << "d\n"; return 1; } 

はに許可されていません。

さらに、C++ 11以降では、より洗練された関数を書くことができ、それでもコンパイル時にconstexprを使用して評価することができます。

関連する問題