繁体   English   中英

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

[英]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.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM