[英]Remove constexpr from C++14 template specialization?
基本问题是是否应该可以从专门的模板方法中添加或删除constexpr。
让我们假设以下代码:
//this is my general vector template with a constexpr default ctor
template<typename T, typename STORE>
struct alignas(16) vec {
union {
STORE st;
struct { T x; T y; T z; T w; };
};
inline explicit constexpr vec() noexcept :
x{0}, y{0}, z{0}, w{0} {
}
};
//and this is the SSE enabled version, where we cannot use
//constexpr because of _mm_setzero_ps, so let's remove it...
template<>
inline vec<float, __m128>::vec() noexcept :
st(_mm_setzero_ps()) {
}
GCC编译它没有问题,但是clang抱怨说“'vec'的非constexpr声明在constexpr声明之后”。 我不知道哪个编译器正确,为什么? (到目前为止,我无法测试MSVC)
编辑:因为人们对复制和粘贴错误非常挑剔,所以我更正了代码,以便对其进行编译。
如标准N4567草案的7.1.5内的注释所述,它似乎是有效的代码。
7.1.5 constexpr说明符[dcl.constexpr]
1 constexpr说明符应仅应用于变量或变量模板的定义,函数或函数模板的声明或文字类型的静态数据成员的声明(3.9)。 如果函数或函数模板的任何声明都有constexpr说明符,则其所有声明都应包含constexpr说明符。 [注意: 就constexpr说明符而言,显式专门化可以与模板声明不同。 —结束说明] [注意:函数参数不能声明为constexpr。 —尾注]
因此,gcc似乎是正确的。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.