Differences
This shows you the differences between two versions of the page.
| Both sides previous revision Previous revision Next revision | Previous revision | ||
| c_namespaces [2018/02/01 10:58] – [Nested namespaces] rpjday | c_namespaces [2018/02/01 14:50] (current) – [using-Directives] rpjday | ||
|---|---|---|---|
| Line 41: | Line 41: | ||
| namespace ATT = American_Telephone_and_Telegraph; | namespace ATT = American_Telephone_and_Telegraph; | ||
| </ | </ | ||
| + | |||
| + | Also, namespace identifier is "... either a previously unused identifier, in which case this is // | ||
| ===== Extensibility (namespaces are " | ===== Extensibility (namespaces are " | ||
| Line 70: | Line 72: | ||
| ==== using-Declarations ==== | ==== using-Declarations ==== | ||
| + | |||
| + | Read [[http:// | ||
| "makes the symbol name from the namespace ns_name accessible for unqualified lookup as if declared in the same class scope, block scope, or namespace as where this using-declaration appears." | "makes the symbol name from the namespace ns_name accessible for unqualified lookup as if declared in the same class scope, block scope, or namespace as where this using-declaration appears." | ||
| Line 91: | Line 95: | ||
| } | } | ||
| </ | </ | ||
| + | |||
| + | Useful for introducing base class members into derived class definitions. | ||
| ==== using-Directives ==== | ==== using-Directives ==== | ||
| + | |||
| + | cppreference.com link [[http:// | ||
| "From the point of view of unqualified name lookup of any name after a using-directive and until the end of the scope in which it appears, every name from ns_name is visible as if it were declared in the nearest enclosing namespace which contains both the using-directive and ns_name." | "From the point of view of unqualified name lookup of any name after a using-directive and until the end of the scope in which it appears, every name from ns_name is visible as if it were declared in the nearest enclosing namespace which contains both the using-directive and ns_name." | ||
| Line 158: | Line 166: | ||
| < | < | ||
| + | void h(); | ||
| + | |||
| namespace X { | namespace X { | ||
| void g(); | void g(); | ||
| Line 170: | Line 180: | ||
| void X::Y::ff() | void X::Y::ff() | ||
| { | { | ||
| - | f(); g(); h(); | + | f(); g(); h(); // all fine |
| } | } | ||
| void X::g() | void X::g() | ||
| { | { | ||
| - | f(); | + | f(); |
| - | Y:: | + | Y:: |
| } | } | ||
| void h() | void h() | ||
| { | { | ||
| - | f(); | + | f(); |
| - | Y:: | + | Y:: |
| - | X:: | + | X:: |
| - | X:: | + | X:: |
| } | } | ||
| </ | </ | ||
| + | |||
| + | NOTE: C++17 allows '' | ||
| ===== Namespace aliases ===== | ===== Namespace aliases ===== | ||
| Line 205: | Line 217: | ||
| </ | </ | ||
| - | A namespace alias cannot be used to re-open a namespace. | + | * Aliases can be used to refer to nested namespaces. |
| + | * A namespace alias cannot be used to re-open a namespace. | ||
| - | (Add ability to alias nested namespaces.) | ||
| ===== Inline namespaces (new in C++11) ===== | ===== Inline namespaces (new in C++11) ===== | ||
| Line 274: | Line 286: | ||
| ===== Unnamed namespaces ===== | ===== Unnamed namespaces ===== | ||
| - | Its members have potential scope from their point of declaration to the end of the translation unit, and have internal linkage. | + | Its members have potential scope from their point of declaration to the end of the translation unit, and have //internal// linkage. The aim is to preserve locality of code rather than to present an interface to users. |
| + | |||
| + | < | ||
| + | #include " | ||
| + | namespace { | ||
| + | int a; | ||
| + | void f() {...} | ||
| + | int g() | ||
| + | } | ||
| + | </ | ||
| + | |||
| + | An unnamed namespace has an implied using-directive. | ||
| + | " | ||
| ===== Argument dependent lookup (ADL) ===== | ===== Argument dependent lookup (ADL) ===== | ||