c++ - gcc v10 和 v9 之间的 constexpr 区别:错误或功能
问题描述
如果使用 gcc v10 编译,下面的代码会出现错误,但对于 gcc v9,代码是可以的。
template<auto N>
struct A {
constexpr auto size() const {
return N;
}
};
template<typename T>
void foo1(const T& a) {
constexpr auto s = a.size(); // Why error here?
}
template<typename T>
void foo2(T a) {
constexpr auto s = a.size(); // OK
}
int main() {
A<10> x1;
foo1(x1);
foo2(x1);
A<x1.size()> x2; // OK
constexpr auto s = x1.size(); // OK
}
据我了解,成员函数 size() 在所有情况下都可以称为 constexpr。但是有一种情况是 gcc10 的行为与 gcc9 相比发生了变化:如果参数是由 const-ref 传递的。我不明白为什么这不应该是 constexpr?
另一个例子:
template<auto N>
struct A {
constexpr auto size() const {
return N;
}
};
template<typename T>
constexpr void foo1(const T& a) {
constexpr auto s = a.size(); // Why error here?
return s;
}
template<typename T>
constexpr auto foo2(const T& a) {
return a.size(); // Why OK here
}
int main() {
A<10> x1;
constexpr auto s1 = foo1(x1);
constexpr auto s2 = foo2(x1);
}
我不明白其中的区别。
解决方案
推荐阅读
- python - 编码 Kmp 算法时出现此错误(IndexError:字符串索引超出范围)
- node.js - JTW白名单性能
- qt - 在js中使用qt activex属性值总是返回空
- scala - 使 Rho swagger.json 不需要 Auth
- c# - 如何获得总堆分配?GC.GetAllocatedBytesForCurrentThread() 不这样做
- express - 如何在前端使用 HttpOnly jwt cookie
- javascript - 这段正在工作的代码怎么可能现在被忽略了?
- google-bigquery - 使用 Python API 获取 BigQuery 临时表“目标表”
- c# - linq 如果索引不同则知道跳过
- webpack - 将 postcss-loader 从 3.0.0 迁移到 4.0.2 会导致错误:[object Object] 不是 PostCSS 插件