8
次のC++ 11コードを混在させてコンパイルしようとしました。ブランチのLambdaは定数式ではありません:誰が正しいですか?
struct NoTemplate {
static constexpr auto (*foo)() = false ? +[]{} : nullptr;
};
NoTemplate no_inst;
template<typename>
struct YesTemplate {
static constexpr auto (*foo)() = false ? +[]{} : nullptr;
};
YesTemplate<float> yes_inst;
- 打ち鳴らす:sucessfully
NoTemplate
をコンパイルします。YesTemplate
にerror: a lambda expression may not appear inside of a constant expression
と表示されます。 - gcc:正常に両方をコンパイルします。
- msvc:クラッシュします。
- ICC:クラッシュ(私たちは勝者を持っている!)
正しい結果とは何ですか?定数式の短絡演算子の誤った枝で非定数式がOKであるべきであることを示唆している標準言語がいくつかありますが、IANALLです。
クラッシュは、コンパイラがクラッシュするか、プログラムがクラッシュすることを意味しますか? – user4581301
最新のVC(19.12.something)で、標準がC++ 17に設定され、警告がレベル4に設定されています。 '+'であいまいな演算子を取得します – SoronelHaetir
clangバグのように見えますが、clang HEADは診断を提供しません(https://wandbox.org/permlink/2I7TE8WOTzZvmeZC)言語[条件の評価されていない部分でラムダをサポート](https://stackoverflow.com/q/22232164/1708801) –