基本问题是,是否应该可以在专门的模板方法中添加或删除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()) {
}
海湾合作委员会编制它没有任何问题,但是clang抱怨说,&#34;非constexpr宣布&#39; vec&#39;遵循constexpr声明&#34;。我想知道哪个编译器正确,为什么..? (到目前为止,我无法测试MSVC)
编辑:因为人们对复制和粘贴错误非常挑剔,所以我更正了代码以便编译。
答案 0 :(得分:0)
它似乎是标准草案N4567
草案7.1.5中的说明中所述的有效代码7.1.5 constexpr说明符[dcl.constexpr]
1 constexpr说明符应仅适用于变量或的定义 变量模板,函数或函数模板的声明, 或声明文字类型的静态数据成员的声明(3.9)。如果 任何函数或函数模板的声明都有一个constexpr 说明符,然后它的所有声明都应包含constexpr 符。 [注意:明确的专业化可能与 关于constexpr说明符的模板声明。 - 结束 注意] [注意:函数参数不能声明为constexpr。 - 结束 注意]
所以gcc似乎是正确的。