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
insideBoo
insidefoo
,所以查找应该以相同的方式工作,为什么您认为应该使用不同的查找方法?