Реализация статического метода constexpr вызывает ошибку gcc? - PullRequest
1 голос
/ 09 октября 2011

Вот фрагмент кода:

class Class
{
    static constexpr int getBug();
};

constexpr int Class::getBug()
{
    return 0;
}

В основном я объявляю метод static constepxr в объявлении класса, а затем реализую его.

Оригиналкод был разделен на два файла и содержал больше методов / атрибутов, которые были удалены, оставляя только необходимый код.

Когда я компилирую код, я получаю следующую ошибку из GCC 4.6.0:

Class.cpp:6:29: internal compiler error: in merge_types, at cp/typeck.c:825
Please submit a full bug report,
with preprocessed source if appropriate.
See <http://gcc.gnu.org/bugs.html> for instructions.
  1. Это действительно ошибка?

  2. В таком случае, что я должен предоставить в моем отчете?


Я протестировал код на онлайн-компиляторе C ++ 0x и получил следующую ошибку:

prog.cpp:3:33: error: the 'constexpr' specifier cannot be used in a function declaration that is not a definition
prog.cpp:6:29: error: a constexpr function cannot be defined outside of its class

Этот компилятор использует GCC 4.5.1.Это дало мне знать, что мой код некорректно сформирован, но задайте еще вопрос:

  1. Почему GCC 4.5.1 выдает ошибку, а GCC 4.6.0 сообщает об ошибке?

После написания последнего абзаца я протестировал на GCC 4.6.0 удаление ключевого слова static, и отдельная реализация компилируется без предупреждения!

  1. Почему два компилятора из одного семейства ведут себя так по-разному?

Я знаю, что методы constexpr должны избегать любых операторов, отличных от return,который может объяснить сообщение об ошибке GCC 4.5.1.Поскольку мой метод использует условие макроса для возврата хорошего (постоянного) значения, требуется пара строк, объясняющая, почему я хочу использовать отдельную реализацию (в дополнение к обычной рекомендации).


Моя конфигурация:

Mac OS X.7
GCC 4.6.0
Target: x86_64-apple-darwin10.7.0
Configured with: ./configure
COLLECT_GCC_OPTIONS='-mmacosx-version-min=10.7.0' '-v' '-save-temps' '-std=c++0x' '-c' '-shared-libgcc' '-mtune=core2'

1 Ответ

5 голосов
/ 09 октября 2011

Это связано с тем, что constexpr является новой функцией языка, и согласно странице поддержки C ++ 0x в GCC , поддержка этой функции была впервые добавлена ​​в GCC в 4.6. Я подозреваю, что это на самом деле ошибка в компиляторе, которая может быть исправлена ​​в 4.6.1 или новее.

GCC 4.5.2 генерирует ошибку, потому что функция еще не доступна в этой версии. Фактически, если бы вы проверили заголовки стандартной библиотеки для 4.5.2, вы бы увидели, что все методы constexpr (согласно стандарту) говорят что-то вроде 'Needs constexpr'.

...