在参考这个问题。用于初始化constexpr
变量的核心常量表达式y
格式不正确。这么多是给定的。
但是,如果我尝试将其if
变成if constexpr
:
template <typename T>
void foo() {
constexpr int x = -1;
if constexpr (x >= 0){
constexpr int y = 1 << x;
}
}
int main(){
foo<int>();
}
错误仍然存在。GCC 7.2 仍然提供:
error: right operand of shift expression '(1 << -1)' is negative [-fpermissive]
但我认为语义检查应该留在废弃的分支上。
但是,通过 lambda 进行间接constexpr
处理确实有帮助:
template <typename T>
void foo(){
constexpr int x = -1;
constexpr auto p = []() constexpr { return x; };
if constexpr (x >= 0){
constexpr int y = 1<<p();
}
}
on说明constexpr
符y
似乎改变了检查丢弃分支的方式。这是预期的行为吗?
@max66很友好地检查了其他实现。他报告说,GCC (7.2.0 / Head 8.0.0) 和 Clang (5.0.0 / Head 6.0.0) 都可以重现该错误。