2014-06-14 6 views
5

Я прочитал раздел об определении пространства имен. Пункт 7.3.1 N3797 сказал:inline пространство имен и расширение пространства имен

Рядный ключевое слово может быть использовано на разгибания пространства имен определения только если он ранее был использован на оригинал-пространства имен определения для этого пространства имен.

Рассмотрим следующий фрагмент кода:

namespace M 
{ 
    int h; 
} 

inline namespace M 
{ 
    int j = 6; 
} 

Составлен успешно и с -std=c++11 и без этой опции. Можете ли вы объяснить это поведение? Это ошибка g++?

ответ

4

Ссылка на стандарт в явной форме: это недопустимо.

Использование Clang ++ Я получаю сообщение об ошибке очень ясно об этом:

Test0614-1.cpp:17:18: error: non-inline namespace cannot be reopened as inline 
inline namespace M 
       ^
Test0614-1.cpp:12:11: note: previous definition is here 
namespace M 
     ^

Так что окончательно ошибка в г ++. Кстати, здесь сообщается: https://gcc.gnu.org/bugzilla/show_bug.cgi?id=53402

Тот факт, что компилятор принимает встроенное пространство имен для предыдущей версии стандарта и, по крайней мере, является предупреждением, по-видимому, является проблемой. Это уже сообщалось как ошибка в 2010 году и должно быть исправлено: https://gcc.gnu.org/bugzilla/show_bug.cgi?id=43824

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