constexpr 函数的常量引用参数:gcc/msvc vs clang/icc
const reference argument of constexpr function: gcc/msvc vs clang/icc
我发现使用常量引用参数调用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++ 标准取消具有引用类型的计算 id 表达式参与常量表达式的资格(除非满足更多约束,而此代码并非如此(。
然而,海湾合作委员会似乎忽略了这一规则。使用这个简化函数可以获得相同的结果(gcc 接受,clang 拒绝(:
constexpr void ff(const int &s)
{
static_assert((s, true), "oops!");
}
所以这个问题与静态成员函数无关。我的解释是这是一个 gcc 错误。
我没有检查msvc,也许那里的错误不同,但它仍然是错误的。
相关文章:
- 在VS代码中交叉编译Windows与Linux上的MinGW的SDL程序
- MSVC多行宏编译器错误
- 如何为模板化对象创建模板向量?VS正在投掷C3203
- 数据成员SFINAE的C++17测试:gcc vs clang
- 为什么在Windows上的VS 2019和Clang 9中"size_t"在没有标题的情况下工作
- 为什么使用__LINE_的代码在发布模式下在MSVC下编译,而不是在调试模式下
- MSVC是否支持C++11样式的属性而不是__declspec
- 在for循环中使用auto vs decltype(vec.size())来处理字符串的向量
- CRTP 中的复制赋值运算符 - gcc vs clang 和 msvc
- 命名空间范围内的外部 - GCC vs clang vs msvc
- Visual C++: MSVC vs. GCC+CLANG: 处理 lambda 捕获类成员变量,正确的方法是什么?
- constexpr 函数的常量引用参数:gcc/msvc vs clang/icc
- variadic模板代码中的GCC VS MSVC编译误差
- 缩小从"int"(常量表达式)到"无符号int"的转换 - MSVC vs gc
- Clang vs MSVC:处理模板函数原型
- Clang vs GCC vs MSVC模板转换操作符-哪个编译器是正确的
- Clang vs. GCC vs. MSVC中的SFINAE和可见性检查——这是正确的
- MinGW vs MinGW- w64 vs MSVC (vc++)交叉编译
- clang vs gcc和msvc中的方法指针模板
- 错误C2027: gcc vs msvc的情况