2014-06-14 10 views
5

J'ai lu la section sur la définition de l'espace de noms. L'article 7.3.1 de N3797 dit:espace de noms en ligne et espace de noms d'extension

Le mot-clé en ligne peut être utilisé sur une extension namespace définition que si elle a déjà été utilisé sur l'espace de noms définition d'origine pour cet espace de noms.

Tenir compte de l'extrait de code suivant:

namespace M 
{ 
    int h; 
} 

inline namespace M 
{ 
    int j = 6; 
} 

Il a compilé réussi à la fois avec le -std=c++11 et sans cette option. Pouvez-vous expliquer ce comportement? Est-ce un bug g++?

Répondre

4

Votre référence à la norme est explicite: ceci n'est pas autorisé.

En utilisant Clang ++ je reçois le message très clair d'erreur à ce sujet:

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 
     ^

Il est donc définitivement un bug en g ++. Soit dit en passant, il est signalé ici: https://gcc.gnu.org/bugzilla/show_bug.cgi?id=53402

Le fait que le compilateur accepte l'espace de noms en ligne pour la version précédente de la norme et sans au moins un avertissement semble être un problème. Cela a déjà été signalé comme bug en 2010 et aurait dû être corrigé: https://gcc.gnu.org/bugzilla/show_bug.cgi?id=43824