2017-12-19 30 views
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をコンパイルします。 YesTemplateerror: a lambda expression may not appear inside of a constant expressionと表示されます。
  • gcc:正常に両方をコンパイルします。
  • msvc:クラッシュします。
  • ICC:クラッシュ(私たちは勝者を持っている!)

正しい結果とは何ですか?定数式の短絡演算子の誤った枝で非定数式がOKであるべきであることを示唆している標準言語がいくつかありますが、IANALLです。

+3

クラッシュは、コンパイラがクラッシュするか、プログラムがクラッシュすることを意味しますか? – user4581301

+0

最新のVC(19.12.something)で、標準がC++ 17に設定され、警告がレベル4に設定されています。 '+'であいまいな演算子を取得します – SoronelHaetir

+2

clangバグのように見えますが、clang HEADは診断を提供しません(https://wandbox.org/permlink/2I7TE8WOTzZvmeZC)言語[条件の評価されていない部分でラムダをサポート](https://stackoverflow.com/q/22232164/1708801) –

答えて

0

このプログラムは整形式です。

注意C++ 17以降では、ラムダ式が評価されてもコア定数式で受け入れられることがあります。提案された論文N4487を詳細に見ることができます。

関連する問題