qualification explicite dans la déclaration C ++

La définition de l’espace de noms suivante échoue lors de la compilation de la première déclaration. Si la première déclaration de foo n’est pas commentée, alors la compilation est parfaite.

 namespace Y { //void foo(); void ::Y::foo(){} } 

La partie pertinente de la norme (§8.3¶1) dit:

Lorsque le déclarateur-id est qualifié, la déclaration doit faire référence à un membre précédemment déclaré

Je comprends que cette règle empêche l’introduction de noms dans d’autres espaces de noms. Je me demande si cette règle pourrait être assouplie pour permettre aux identificateurs qualifiés de se référer à l’espace de noms actuel.

Le CWG n ° 482 est pertinent:

Selon le paragraphe 1 de la section 8.3, […]
Cette ressortingction interdit les exemples suivants:

 void f(); void ::f(); // error: qualified declarator namespace N { void f(); void N::f() { } // error: qualified declarator } 

Il ne semble pas y avoir de bonne raison pour refuser de telles déclarations, et un certain nombre de mises en œuvre les acceptent malgré l’interdiction de la norme. La norme devrait-elle être modifiée pour les autoriser?

Notes de la réunion d’avril 2006:

En discutant de la question 548 , le CWG a convenu de lever l’interdiction des déclarants qualifiés dans leur espace de noms.

Votre code est donc valide si la première déclaration de foo est présente (à partir de 2012 environ; GCC a un rapport de bogue ouvert ). Si ce n’est pas le cas, cependant, votre formulation citée s’applique toujours et rend la déclaration qualifiée mal formée. Je ne vois aucune raison de permettre ce cas; cela implique intuitivement que le nom a déjà été déclaré, car la recherche de nom qualifié doit déterminer ce à quoi elle fait référence.