c++ - GCC和clang之间的constexpr差异
问题描述
以下在 GCC 9 中编译但不在 clang 10 中编译,我想知道这两个编译器中的哪一个符合标准:
template<typename T>
struct A {
static const T s;
static const T v;
};
template<typename T>
constexpr const T A<T>::s = T(1);
template<typename T>
constexpr const T A<T>::v = A<T>::s;
int main(int, char**) {
constexpr auto a = A<double>::v;
return 0;
}
这是一个更大问题的最小示例,这就是为什么字段s
和v
被显式声明为const
但被定义为constexpr
,这是故意的。
GCC 正确编译该代码还是正确拒绝它?
解决方案
编译器只需将static const
整型和枚举类型的变量视为constexpr
使用常量表达式进行初始化。constexpr
这使得在添加到语言之前可以将它们用作数组长度。
推荐阅读
- python - 使用 urllib 和 bs4 "http.client.BadStatusLine:" 时出现错误
- loops - 试图重现“电传打印机效果”,但 char 之间的时间保持不变
- python - sqlite3.DatabaseError:创建表时文件不是数据库
- html - Bootstrap 相对于屏幕大小调整图像大小
- docker - 在 docker 中启动的 Spring Boot 应用程序无法访问环境变量
- html - 如何使用flexbox对齐容器右侧的两个文本框
- javascript - 使用multer在nodejs中上传大文件
- javascript - 仅当工作表“每日 #s WK1”中的单元格 c2 更改时如何运行谷歌脚本
- qt - 壁纸插件 KDE 等离子中的 config.qml
- php - 使用 PHP 列出所有逗号分隔的值