The first form is an attribute and only affects mangling, and is implemented
in dmd.attrib.
The second form introduces a named scope and allows symbols to be refered
to with or without the namespace name, much like a named template mixin,
and is implemented in this module.
Hence the Nspace symbol implements the usual ScopeDsymbol semantics.
Note that it implies extern(C++) so it cannot be used as a generic
named scope. Additionally, Nspace with the same Identifier can be
defined in different module (as C++ allows a namespace to be spread accross
translation units), but symbols in it should be considered
part of the same scope. Lastly, not all possible C++ namespace names
are valid D identifier.
A scoped C++ namespace symbol
D supports the following syntax to declare symbol(s) as being part of a C++ namespace:
The first form is an attribute and only affects mangling, and is implemented in dmd.attrib. The second form introduces a named scope and allows symbols to be refered to with or without the namespace name, much like a named template mixin, and is implemented in this module.
Hence the Nspace symbol implements the usual ScopeDsymbol semantics.
Note that it implies extern(C++) so it cannot be used as a generic named scope. Additionally, Nspace with the same Identifier can be defined in different module (as C++ allows a namespace to be spread accross translation units), but symbols in it should be considered part of the same scope. Lastly, not all possible C++ namespace names are valid D identifier.