繁体   English   中英

gcc 和 clang 不同意表达式是否为常量求值

[英]gcc and clang disagree on whether expression is constant evaluated

对于以下程序:

struct S { int i; };

constexpr S f() { 
  return std::is_constant_evaluated() ? S{1} : S{0}; 
}

int main() {
  S s = f();
  return s.i;
}

gcc 返回 0, clang返回 1。

我不认为f的评估是在需要不断评估的上下文中进行的,所以我认为 clang 在这里是错误的。 还是相反? 还是两个结果都有效?

我们正在寻找的要求是,如果一个表达式明显是常量求值的,它在[expr.const]/14中定义,即:

  • 一个常量表达式,或
  • constexpr if 语句 ([stmt.if]) 的条件,或
  • 立即调用,或
  • 替换为原子约束表达式以确定是否满足的结果([temp.constr.atomic]),或
  • 可用于常量表达式或具有常量初始化的变量的初始化器。

这些条件中的前四个显然不成立。

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

对于最后一个的最后一部分,我们需要确定我们是否有常量初始化(不要与常量初始化混淆)。 该定义在[basic.start.static]/2中,强调我的:

如果变量或临时 object与 static 或线程存储持续时间为常量初始化 ([expr.const]),则执行常量初始化。

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

因此,任何条件都不成立,并且在 OP 中, std::is_constant_evaluated()应该返回false ,这是一个 clang 错误。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM