Pow*_*ice 4 c++ undefined-behavior language-lawyer constexpr
该代码在GCC 8中编译,但不在GCC 7和clang中编译。
constexpr int a = 1;
constexpr int b = --const_cast<int&>(a);
Run Code Online (Sandbox Code Playgroud)
这显然是UB。
我的问题:Standardese对评估包含UB的constexpr有什么看法-此代码应该完全编译吗?
constexpr编译时表达式中的所有未定义行为使表达式在编译时不求值(consteval基本上不是使用基本上具有该含义的新关键字)。
constexpr有效地初始化一个要求consteval。
如果您所做的是UB(我相信是),我不会谈,但是如果是UB,则不应编译。
我将看看是否可以找到标准引号来支持这些断言。但是这里没有棘手的语言律师要求。一个简单的原则:在编译时评估编译时表达式时,编译器必须审核它为UB运行的代码,并且如果它们再次运行到UB中(再次在编译时),则该表达式不再是编译时表达式。