GCC和clang之间的constexpr差异
constexpr differences between GCC and clang
以下是在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编译该代码是正确的,还是clang拒绝它是正确的?
如果使用常量表达式初始化,则编译器只需要将整型和枚举类型的static const
变量视为constexpr
。这使得在constexpr
被添加到该语言之前可以将它们用作数组长度。
相关文章:
- lambda参数转换为constexpr技巧,然后获取带链接的数组
- 多成员Constexpr结构初始化
- 条件constexpr函数
- constexpr 函数中的非文字(通过 std::is_constant_evaluated)
- 将两个数组中的差异记录在第三个数组中
- Visual C++ constexpr Hints
- 大小相等但成员数量不同的结构之间的性能差异
- 如何确认我的constexpr表达式实际上已经在编译时执行
- 为什么constexpr的性能比正常表达式差
- 是否可以使用if constexpr删除控制流语句
- 要与"if constexpr"一起使用的编译时消息(在预处理器之后)
- 为什么std::isnan 不是 constexpr?
- Constexpr替代了新的放置方式,可以让内存中的对象保持未初始化状态
- 当一个值是非常量但用常量表达式初始化时使用constexpr
- C++constexpr实现差异
- 类内部和外部静态 constexpr 元组之间的差异
- 全局和局部变量初始化与 constexpr 的差异背后的基本原理
- 在评估不同参数的constexpr函数时,运行时差异
- GCC8.2 和(英特尔)ICC19.0.1 之间的 constexpr 差异
- 在constexpr中使用strcmp的编译器差异