CWG Issue 1838 (original) (raw)

This is an unofficial snapshot of the ISO/IEC JTC1 SC22 WG21 Core Issues List revision 118e. See http://www.open-std.org/jtc1/sc22/wg21/ for the official list.

2025-11-05


1838. Definition via unqualified-id and using-declaration

Section: _N4868_.9.8.2.3 [namespace.memdef]Status: CD4Submitter: Richard SmithDate: 2014-01-17

[Moved to DR at the November, 2014 meeting.]

The Standard is not clear about what happens when an entity is declared but not defined in an inner namespace and declared via a_using-declaration_ in an outer namespace, and a definition of an entity with that name as an unqualified-id appears in the outer namespace. Is this a legitimate definition of the inner-namespace entity, as it would be if the definition used a qualified-id, or is the definition a member of the outer namespace and thus in conflict with the using-declaration? There is implementation divergence on the treatment of such definitions.

See also issues 1708 and1021.

Notes from the February, 2014 meeting:

CWG agreed that the definition in such cases is a member of the outer namespace, not a redeclaration of the name introduced in that namespace by the using-declaration.

Proposed Resolution (July, 2014):

  1. Change _N4868_.9.8.2.3 [namespace.memdef] paragraph 1 as follows:

Members (including explicit specializations of templates (13.9.4 [temp.expl.spec])) of a namespace can be defined within that namespace. A declaration in a namespaceN (excluding declarations in nested scopes) whose_declarator-id_ is an unqualified-id declares (or redeclares) a member of N, and may be a definition. [_Note:_ An explicit instantiation (13.9.3 [temp.explicit]) or explicit specialization (13.9.4 [temp.expl.spec]) of a template does not introduce a name and thus may be declared using an unqualified-id in a member of the enclosing namespace set, if the primary template is declared in an inline namespace. —_end note_] [Example:

namespace X { void f() { /* ... */ } // OK: introduces X::f()

namespace M { void g(); // OK: introduces X::M::g() } using M::g; void g(); // error: conflicts with X::M::g() }

—_end example_]

  1. Change _N4868_.9.8.2.3 [namespace.memdef] paragraph 3 as follows:

Every name first declared in a namespace is a member of that namespace. If a friend declaration...

This resolution also resolves issues 1021and 987.