Вот фрагмент кода:
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.
Это действительно ошибка?
В таком случае, что я должен предоставить в моем отчете?
Я протестировал код на онлайн-компиляторе 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.Это дало мне знать, что мой код некорректно сформирован, но задайте еще вопрос:
- Почему GCC 4.5.1 выдает ошибку, а GCC 4.6.0 сообщает об ошибке?
После написания последнего абзаца я протестировал на GCC 4.6.0 удаление ключевого слова static
, и отдельная реализация компилируется без предупреждения!
- Почему два компилятора из одного семейства ведут себя так по-разному?
Я знаю, что методы 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'