分支中的Lambda没有采用恒定表达:谁是对的?

Ses*_*ing 7 c++ lambda language-lawyer c++11

我尝试使用混合结果编译以下C++ 11代码.

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;
Run Code Online (Sandbox Code Playgroud)
  • clang:NoTemplate成功编译; 给error: a lambda expression may not appear inside of a constant expressionYesTemplate.
  • gcc:成功编译
  • msvc:崩溃.
  • icc:崩溃(我们有一个胜利者!)

什么是正确的结果?我看到一些标准语言暗示非常量表达式应该在常量表达式中的短路运算符的假分支中可以正常,但IANALL.

xsk*_*xzr 1

这个程序格式良好。

请注意,在 C++17 之后,核心常量表达式中可以接受 lambda 表达式,即使它会被求值。您可以参阅建议的论文N4487了解详细信息。