Компилятор Intel и не может иметь инициализатор в классе при использовании 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?


person Ben Bergen    schedule 20.03.2014    source источник


Ответы (2)


Это ошибка компилятора Intel, она отправлена ​​в Intel и будет исправлена ​​в будущих версиях.

См. также множественные ошибки constexpr, ошибка sfinae с компилятором Intel C++ 15 и ошибка метода constexpr с компилятором C++ 15 на форумах Intel.

person Shenghong    schedule 03.02.2015

Кажется, ваш компилятор устарел. Флаг -std=c++0x показывает, что он был реализован задолго до того, как был реализован стандарт C++11.

Попробуйте использовать переключатель -std=c++11, если ваш компилятор его поддерживает.

В противном случае обновите свой компилятор или не используйте эти модные новые функции.

person Sergey K.    schedule 04.04.2014
comment
не используйте эти причудливые новые функции Эти функции не новы, но (на момент ОП) ›2 года назад. - person Walter; 19.02.2015
comment
@Walter: То есть constexpr по-прежнему не поддерживается в полной мере в последней CTP-версии VisualStudio 2015. Как бы мне ни было больно это говорить, если вы серьезно относитесь к совместимости, вам не следует использовать эти функции. - person Sergey K.; 19.02.2015
comment
Я думаю, что ошибка здесь связана с Intel, а не с пользователями C++. Intel подводит своих клиентов, и они должны перестать платить за такой плохой сервис! - person Walter; 20.02.2015
comment
@Walter В идеальном мире я бы полностью согласился. Но в Windows мы просто используем те инструменты, которые у нас есть. - person Sergey K.; 20.02.2015