#include <iostream>
using namespace std;
constexpr int f(bool b){ return b ? throw 0 : 0; } // OK
constexpr int f() { return f(true); } // Ill-Formed, No Diagnostic Required
int main(){
try{
f();
}catch(int x){
cout << "x = " << x << endl;
}
return 0;
}
このコードは、C++ 14標準(ISO/IEC 14882:2014)、セクション7.1.5 、パラグラフ5:非テンプレート、非不履行constexprの機能又は非テンプレートの診断不要(NDR):ConstExpr関数C++で投げる14
、非不履行、非継承引数値は、存在しない場合、constexprのコンストラクタをその関数の呼び出しまたはコンストラクタは、コア定数式(5.19)の評価された部分式である可能性があり、プログラムは不正である。診断は必要ありません。
それは次のように記載されてスロー発現はコア定数式(5.19/2)ではないので、「が悪い形成されない診断はを必要としません」。しかし、ClangとGCCの両方が正常にコンパイルします(Ideone)。
- は、このコード正しいです(とそこに間違いが標準である)、または、それは間違っている(とクランとGCCの両方にバグがありますか)?
私はまた、標準的な文言についてのこれらの興味深い議論が見つかりました:
- Difference between Undefined Behavior and Ill-formed, no diagnostic message required
- What is the rationale to "no diagnostic required"?
- What is the C++ compiler required to do with ill-formed programs according to the Standard?
はそれが可能/このプログラムは、「病気であるということです - 形成され、診断不要 "とコンパイラはそれを正常にコンパイルできますか?
「診断不要」とはどういう意味ですか? – ildjarn
メモリから、clangはスローされた例外をコンパイラエラーとして解釈し、少なくとも標準的な例外をスローするとうまく報告します。私はそれが素敵なタッチだと思った。 –
あなたはあなたがリンクしている "興味深い議論"で答えを見つけることができます。 – molbdnilo