英特尔编译器和使用constexpr时“不能拥有类内初始化程序”

时间:2014-03-20 17:02:36

标签: c++11 constexpr

以下测试程序使用g ++编译并运行良好。使用Intel icpc(14.0.2),如果我使用像double这样的显式类型而不是模板,它将编译并运行。带有icpc的模板版本会产生错误:

icpc -g -O2 -I. -std=c++0x -c main.cc -o main.o

main.cc(10): error: a member of type "const T [9]" cannot have an in-class initializer
    static constexpr T dx_[9] = {

测试代码

template<typename T>
class myclass {

public:

    static constexpr T dx_[9] = {
         1.5,  2.0, -0.5,
        -0.5,  0.0,  0.5,
         0.5, -2.0, -1.5
        };
};

template<typename T> constexpr T myclass<T>::dx_[9];

int main(int argc, char *argv[]) {
    return 0;
} // main

为什么我在使用constexpr时收到错误“无法使用类内初始化程序”

2 个答案:

答案 0 :(得分:2)

这是英特尔编译器的错误,它已提交给英特尔,并将在未来版本中修复。

另请参阅英特尔论坛上的Multiple constexpr bugssfinae bug with intel c++ compiler 15method constexpr bug with c++ compiler 15

答案 1 :(得分:0)

看来你的编译器已经过时了。 -std=c++0x标志显示它在C ++ 11标准实施之前就已实现。

如果编译器支持,请尝试使用-std=c++11开关。

否则,请升级您的编译器或不要使用这些奇特的新功能。