【问题标题】:const reference argument of constexpr function: gcc/msvc vs clang/icc [duplicate]constexpr 函数的 const 参考参数:gcc/msvc vs clang/icc [重复]
【发布时间】:2019-12-24 10:29:09
【问题描述】:

我发现使用常量引用参数调用 constexpr 静态方法会导致 clang 和 icc 的错误“表达式不是整数常量”,但对于 gcc 或 msvc (https://godbolt.org/z/PewOVc) 则不会:

struct S
{
  static constexpr bool ok() { return true; }
};

constexpr void ff(const S &s) // OK for everyone if not a ref
{  
  static_assert(s.ok(), "oops!"); // ERROR clang/icc, OK gcc/msvc  
  static_assert(S::ok(), "oops!"); // OK for everyone
}

如果参数不是引用,则代码由这些编译器中的任何一个编译。谁是正确的/正确的?

【问题讨论】:

    标签: c++ compiler-errors c++14 language-lawyer


    【解决方案1】:

    C++ 标准disqualifies 评估了具有参与常量表达式的引用类型的 id 表达式(除非满足更多的约束,这不是此代码的情况)。

    但是 gcc 似乎忽略了这个规则。使用这个简化函数可以获得相同的结果(gcc 接受,clang 拒绝):

    constexpr void ff(const int &s) 
    {  
      static_assert((s, true), "oops!"); 
    }
    

    所以问题与静态成员函数无关。我的解释是这是一个 gcc 错误。

    我没有检查msvc,也许那里的错误不同但它仍然是错误的。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2017-08-21
      • 2020-07-13
      • 2013-08-21
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多