C++ gcc和clang对表达式是否为常量求值不一致
对于以下程序: 结构{int i;}; constexpr S f(){ 返回std::is_constant_evaluated()?S{1}:S{0}; } int main(){ S=f(); 返回s.i; } gcc返回0,clang返回1C++ gcc和clang对表达式是否为常量求值不一致,c++,language-lawyer,c++20,constant-expression,C++,Language Lawyer,C++20,Constant Expression,对于以下程序: 结构{int i;}; constexpr S f(){ 返回std::is_constant_evaluated()?S{1}:S{0}; } int main(){ S=f(); 返回s.i; } gcc返回0,clang返回1 我不认为对f的求值是在需要不断求值的上下文中进行的,所以我认为这里的clang是错误的。还是反过来呢?或者这两个结果都有效吗?我们要寻找的要求是,如果表达式是,则定义在中,即: 常量表达式,或 constexpr if语句([stmt.if])的
我不认为对
f
的求值是在需要不断求值的上下文中进行的,所以我认为这里的clang是错误的。还是反过来呢?或者这两个结果都有效吗?我们要寻找的要求是,如果表达式是,则定义在中,即:
- 常量表达式,或
- constexpr if语句([stmt.if])的条件,或
- 立即调用,或
- 替换为原子约束表达式以确定其是否满足([temp.constr.atomic]),或
- 在常量表达式中可用或具有常量初始化的变量的初始值设定项
s
不是具有静态或线程存储持续时间的变量,因此没有恒定的初始化,因此最后一个条件的最后一部分也不成立
因此,所有条件都不成立,在OP中,
std::is_constant_evaluated()
应该返回false
,这是一个明显的错误。在标准示例中,表达式初始化了一个全局变量。gcc对这种修改没有任何影响。这有关系吗?@cigien我不这么认为,这里没有关于范围或存储时间的相关内容。但措辞有点难以理解,所以我不确定。我不确定这是否是一个bug,在这种情况下也会发出叮当声。我觉得这和范围有关。@cigien好的,我找到了正确的一点,我必须再次重写这个答案,再给我几分钟。@cigien好的,也许是第三次。