Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/ssh/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C++ gcc和clang对表达式是否为常量求值不一致_C++_Language Lawyer_C++20_Constant Expression - Fatal编程技术网

C++ gcc和clang对表达式是否为常量求值不一致

C++ 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])的

对于以下程序:

结构{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])的条件,或
  • 立即调用,或
  • 替换为原子约束表达式以确定其是否满足([temp.constr.atomic]),或
  • 在常量表达式中可用或具有常量初始化的变量的初始值设定项
前四个条件显然不成立

对于最后一个变量,我们的变量在常量表达式中不可用,因为它既不是constexpr,也没有const限定的整数/枚举类型。这就是第五个条件的前半部分

对于最后一部分的最后一部分,我们需要确定是否有常量初始化(不要与常量初始化混淆)。我的重点是这一定义:

如果具有静态或线程存储持续时间的变量或临时对象为常量初始化([expr.const]),则执行常量初始化

但是
s
不是具有静态或线程存储持续时间的变量,因此没有恒定的初始化,因此最后一个条件的最后一部分也不成立


因此,所有条件都不成立,在OP中,
std::is_constant_evaluated()
应该返回
false
,这是一个明显的错误。

在标准示例中,表达式初始化了一个全局变量。gcc对这种修改没有任何影响。这有关系吗?@cigien我不这么认为,这里没有关于范围或存储时间的相关内容。但措辞有点难以理解,所以我不确定。我不确定这是否是一个bug,在这种情况下也会发出叮当声。我觉得这和范围有关。@cigien好的,我找到了正确的一点,我必须再次重写这个答案,再给我几分钟。@cigien好的,也许是第三次。