2013-11-13 4 views
8

На звоном (ствол), я могу переслать объявить объект, который позже будет определен с constexpr следующим образом:Как мне переслать-объявить объект constexpr в области пространства имен?

// Fwd-declarations 
struct S; 
extern const S s; 

// (... later) definitions 
struct S {}; 
constexpr S s {}; 

Gcc 4,8 не нравится это, говоря мне предобъявления и определения отличаются constexpr -ness. Действительно ли gcc говорит правду, или это просто ошибка gcc?

ответ

4

Настоящий ответ заключается в том, что gcc явно ошибается, clang is right. Код выше должен компилироваться, и он будет в gcc 4.9. Или так говорит this bug report.

5

Я не могу найти какой-либо язык в моей копии стандарта C++ 11, который явно запрещает constexpr -ness от неправильного сопоставления между объявлением и определением, но я вижу, что язык явно запрещает использование constexpr с extern (раздел 7.1.5), а также язык, требующий инициализатора для переменной класса staticconstexpr, которая должна быть в классе. Кроме того, поскольку утилита 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.

+0

Реализация проекта C++ 14 должна быть включена с помощью '-std = C++ 1y'; вряд ли есть способ сделать это случайно. – Griwes

+0

@Griwes Я не использую Clang в настоящее время (я бы хотел, хотя), поэтому я этого не знал, но это меня не удивляет. Но Clang, возможно, расширил свою поддержку 'constexpr' по всем направлениям (совместимым образом) во время работы над C++ 14. Я просто выбрасываю это как возможность. Поскольку я не могу найти словосочетание в любом случае в стандарте, возможно, что обе реализации являются допустимыми вариантами для C++ 11, или это может быть стандартным дефектом. –

+1

ОК, звучит как ошибка gcc. Я подал его [здесь] (http://gcc.gnu.org/bugzilla/show_bug.cgi?id=59123). –

Смежные вопросы