Movatterモバイル変換


[0]ホーム

URL:


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


101. Redeclaration of extern "C" names via using-declarations

Section:9.10  [namespace.udecl]    Status:TC1    Submitter:Mike Miller    Date:10 Mar 1999

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 entity
I 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.




[8]ページ先頭

©2009-2025 Movatter.jp