3

例如,GCC 和 clang 都无法编译以下代码:

struct S {};

namespace N
{
    void g(S);
}

using N::g;

namespace N
{
    void g(int);
}

int main()
{
    g(0);
}

出现错误:

test.cpp: In function 'int main()':
test.cpp:17:8: error: could not convert '0' from 'int' to 'S'
     g(0);
        ^

暗示 using-declaration 仅导入在using-declaration 出现的点上方声明的重载,而不是可能稍后出现的重载(但在使用名称之前)。

这种行为正确吗?

4

1 回答 1

6

这种行为正确吗?

是的,这种行为是正确的,并且按照 c++ 标准进行了很好的定义。

相关部分是C++11 标准的第 7.3.3.11节:

由 using-declaration 声明的实体应根据 using-declaration 处的定义在使用它的上下文中为人所知。在使用该名称时,不考虑在 using 声明之后添加到命名空间的定义。

[ Example:    
    namespace A {
        void f(int);
     }
    using A::f; // f is a synonym for A::f;
    // that is, for A::f(int).
    namespace A {
        void f(char);
    }
    void foo() {
        f(’a’); // calls f(int),
    } // even though f(char) exists.
    void bar() {
        using A::f; // f is a synonym for A::f;
        // that is, for A::f(int) and A::f(char).
        f(’a’); // calls f(char)
    }
 —end example ]
于 2012-05-09T05:00:30.240 回答