从C ++ 14模板专业化中删除constexpr?

时间:2015-11-30 07:04:35

标签: c++ gcc clang template-specialization constexpr

基本问题是,是否应该可以在专门的模板方法中添加或删除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)

编辑:因为人们对复制和粘贴错误非常挑剔,所以我更正了代码以便编译。

1 个答案:

答案 0 :(得分:0)

它似乎是标准草案N4567

草案7.1.5中的说明中所述的有效代码
  

7.1.5 constexpr说明符[dcl.constexpr]

     

1 constexpr说明符应仅适用于变量或的定义   变量模板,函数或函数模板的声明,   或声明文字类型的静态数据成员的声明(3.9)。如果   任何函数或函数模板的声明都有一个constexpr   说明符,然后它的所有声明都应包含constexpr   符。 [注意:明确的专业化可能与   关于constexpr说明符的模板声明。 - 结束   注意] [注意:函数参数不能声明为constexpr。 - 结束   注意]

所以gcc似乎是正确的。