c++ - constexpr 函数的 const 引用参数:gcc/msvc vs clang/icc
问题描述
我发现使用常量引用参数调用 constexpr 静态方法会导致 clang 和 icc 的错误“表达式不是整数常量”,但对于 gcc 或 msvc 则不会(https://godbolt.org/z/皮沃克):
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 似乎忽略了这个规则。使用这个简化的函数可以获得相同的结果(gcc 接受,clang 拒绝):
constexpr void ff(const int &s)
{
static_assert((s, true), "oops!");
}
所以这个问题与静态成员函数无关。我的解释是这是一个 gcc 错误。
我没有检查msvc,也许那里的错误不同,但它仍然是错误的。
推荐阅读
- python - chardet.detect 返回空语言
- python - Pandas 无法使用 DataFrame 找到 Q3 季度增长率良好的商店
- php - 带有 JOIN 的 SUM() 返回不正确的值
- python - 子类中不存在的类属性
- xamarin - Xamarin.forms Splashscreen (Android) 后闪现的白屏
- python - 语义分割中的数据集拆分
- ios - 后台获取在模拟器中工作但在真实设备中不工作
- vue.js - Vuex Mutation 最佳实践 - 将状态与有效负载合并
- python - 将路径文件夹读取为 int 而不是 string
- html - 我什么时候应该在“class”上使用“className”,反之亦然?