This is an unofficial snapshot of the ISO/IEC JTC1 SC22 WG21 Core Issues List revision 117a. See http://www.open-std.org/jtc1/sc22/wg21/ for the official list.
2025-04-13
Consider the following:
extern "C" void f(); namespace N { extern "C" void f(); } using N::f;According to9.10 [namespace.udecl]paragraph 11, theusing-declaration is an error:
If a function declaration in namespace scope or blockscope has the same name and the same parameter typesas a function introduced by ausing-declaration, theprogram is ill-formed.Based on the context (9.10 [namespace.udecl]paragraph 10 simply reiterates the requirementsof6.4 [basic.scope]), one might wonder ifthe failure to exemptextern "C"functions was intentional or an oversight. After all, there isonly one functionf() involved, because it'sextern "C", soambiguity is not a reason to prohibit theusing-declaration.
This also breaks the relatively strong parallel betweenextern "C"functions and typedefs established in our discussion ofCore issue 14in Santa Cruz. There the question was forusing-directives:
typedef unsigned int size_t; extern "C" int f(); namespace N { typedef unsigned int size_t; extern "C" int f(); } using namespace N; int i = f(); // ambiguous "f"? size_t x; // ambiguous "size_t"?We decided for both that there was no ambiguity because eachpair of declarations declares the same entity. (According to6.1 [basic.pre] paragraph 3,a typedef name is not an entity, but a type is; thus thedeclarations ofsize_t declare the same entity "unsigned int".)
In the context ofusing-declarations, there is no explicitextension of the restrictions in 6.4 [basic.scope]paragraph 4 except as noted above for function declarations; thus the parallelscenario for a typedef is not ill-formed:
typedef unsigned int size_t; namespace N { typedef unsigned int size_t; }; using N::size_t; // okay, both declarations // refer to the same entityI think the first sentence of9.10 [namespace.udecl]paragraph 11 ought to be rewritten as:
If a function declaration in namespace scope or blockscope has the same name and the same parameter typesas a function introduced by ausing-declaration,and the declarations do not declare the same function, theprogram is ill-formed.
Proposed Resolution (10/99):As suggested.