Я не могу найти какой-либо язык в моей копии стандарта C++ 11, который явно запрещает constexpr
-ness от неправильного сопоставления между объявлением и определением, но я вижу, что язык явно запрещает использование constexpr
с extern
(раздел 7.1.5), а также язык, требующий инициализатора для переменной класса static
constexpr
, которая должна быть в классе. Кроме того, поскольку утилита constexpr
значительно уменьшается, когда определение переменной или ее типа недоступно, я думаю, что, скорее всего, предполагается, что переменные constexpr
должны быть определены (или для static
членов класса, инициализированных), когда они объявлены.
Как работа, возможно, вы можете указать псевдоним extern
для переменной. Это позволит вам принять его адрес, и это единственное, что я могу думать о том, что разрешающая декларация позволит. Например:
// .hpp file:
struct C;
extern C const &c;
// .cpp file:
struct C {
constexpr C() { }
};
constexpr C cc;
C const &c = cc;
Side Примечание: Я знаю, что в C++ 14, они вновь/пересматривают constexpr
, так что возможно, что он работает в Clang, потому что он реализует некоторый проект спецификации С ++ 14.
Реализация проекта C++ 14 должна быть включена с помощью '-std = C++ 1y'; вряд ли есть способ сделать это случайно. – Griwes
@Griwes Я не использую Clang в настоящее время (я бы хотел, хотя), поэтому я этого не знал, но это меня не удивляет. Но Clang, возможно, расширил свою поддержку 'constexpr' по всем направлениям (совместимым образом) во время работы над C++ 14. Я просто выбрасываю это как возможность. Поскольку я не могу найти словосочетание в любом случае в стандарте, возможно, что обе реализации являются допустимыми вариантами для C++ 11, или это может быть стандартным дефектом. –
ОК, звучит как ошибка gcc. Я подал его [здесь] (http://gcc.gnu.org/bugzilla/show_bug.cgi?id=59123). –