I would like to check myself whether I understand correctly the following quote below from the C++ 20 Standard (English is not my native language).
Section 9.7.1 Namespace definition:
2 In a named-namespace-definition, the identifier is the name of the namespace. If the identifier, when looked up (6.4.1), refers to a namespace-name (but not a namespace-alias) that was introduced in the namespace in which the named-namespace-definition appears or that was introduced in a member of the inline namespace set of that namespace, the namespace-definition extends the previously-declared namespace. Otherwise, the identifier is introduced as a namespace-name into the declarative region in which the named-namespacedefinition appears.
That is may a namespace be defined in a namespace and then extended in one of its inline namespace? Or vice versa. May a namespace be defined in an inline namespace and then be extended in its enclosing namespace?
Here is a demonstrative program.
#include <iostream> inline namespace N1 { inline namespace N2 { namespace N3 { void f( int ) { std::cout << "f( int )\n"; } } } namespace N3 { void f( char ) { std::cout << "f( char )\n"; } } } int main() { N3::f( 10 ); N3::f( 'A' ); } The program output is
f( int ) f( char ) However for this program the compiler issues an error saying that reference to 'N3' is ambiguous.
#include <iostream> inline namespace N1 { namespace N3 { void f( int ) { std::cout << "f( int )\n"; } } inline namespace N2 { namespace N3 { void f( char ) { std::cout << "f( char )\n"; } } } } int main() { N3::f( 10 ); N3::f( 'A' ); }