C++ c++;:在函数参数列表中使用或不使用命名空间

C++ c++;:在函数参数列表中使用或不使用命名空间,c++,c++11,visual-c++,C++,C++11,Visual C++,考虑这样一个简单的例子: namespace foo { struct Foo {}; struct Boo { void f(Foo); }; } using foo::Boo; void Boo::f(Foo) { } clang和gcc无错误地编译此类代码(-pedantic-std=c++11), 但是VC++-2015报告有关Foo在void Boo::f(Foo)-Foo未声明标识符中键入的错误。如果像这样重写代码:void Boo::

考虑这样一个简单的例子:

namespace foo {
    struct Foo {};
    struct Boo {
        void f(Foo);
    };
}

using foo::Boo;

void Boo::f(Foo)
{

}
clang
gcc
无错误地编译此类代码(
-pedantic
-std=c++11
), 但是
VC++-2015
报告有关
Foo
void Boo::f(Foo)
-
Foo
未声明标识符中键入的错误。如果像这样重写代码:
void Boo::f(foo::foo)
它编译得很好,但是在这样重写之后它还编译什么有趣的东西呢

namespace foo {
    struct Foo {};
    struct Boo {
        void f(Foo);
    };
}

void foo::Boo::f(Foo)
{

}

这是不是符合
c++11
标准的
VC++2015
缺陷?

不,这不是MSVC缺陷。您应该正确地为标识符命名。

但是为什么
vc++
接受最后一个变量而不
正确地命名
?这就是
gcc
clang
bug,因为它们接受带有
pedantic
的代码。最后一个变量是OK的,因为
Boo::f()
位于
名称空间foo
中,所以它的参数类型将在同一名称空间中查找。至于GCC和Clang,我认为他们不会同意这是一个bug,他们只是碰巧接受了他们不需要接受的代码。你不能期望学究式模式是完美的——事实并非如此。对于函数定义中使用的名称,如果该函数是用户声明的命名空间的成员,则在使用该名称之前搜索使用该名称的块,然后根据此规则在块开始之前搜索封闭块,并使用foo::Boo对
应用相同的规则;void Boo::f
void foo::Boo::f
,在这两种情况下
f
inside
Boo
inside
foo
,所以查找应该以相同的方式工作,为什么您认为应该使用不同的查找方法?