3
は、このような単純な例を検討し、関数の引数リストで名前空間を使用して使用するか、ではない:void Boo::f(Foo)
で、Foo
タイプについて が、VC++-2015
レポートエラーをはC++:
namespace foo {
struct Foo {};
struct Boo {
void f(Foo);
};
}
using foo::Boo;
void Boo::f(Foo)
{
}
clang
とgcc
エラーが発生することなく、このようなコードをコンパイル(-pedantic
-std=c++11
を) - Foo
未定義の識別子。 void Boo::f(foo::Foo)
それがうまくコンパイルが、何面白い、それはまた、このようなリライト後にコンパイルされます:
namespace foo {
struct Foo {};
struct Boo {
void f(Foo);
};
}
void foo::Boo::f(Foo)
{
}
はそれがc++11
標準に従ってVC++2015
バグでしょうか?このような場合は書き換えコード
しかし、なぜ 'vC++'が '正しく名前空間'なしで最後の変種を受け入れるのですか?そして、 'gcc'と' clang'バグは、 'pedantic'でそのようなコードを受け入れるからです。 – fghj
'Boo :: f()'が 'namespace foo'にあるので、最後の変種はOKです。そのため、その引数型は同じ名前空間で検索されます。 GCCとClangについては、バグだとは思わないが、受け入れる必要がないコードを受け入れるだけだ。ペダンティックモードが完璧であるとは期待できません。そうではありません。 –
関数がユーザー定義の名前空間のメンバーである関数の定義で使用される名前の場合、名前が使用されるブロックが名前の使用前に検索され、その囲みブロックはその開始前に検索されますブロックhttp://en.cppreference.com/w/cpp/language/unqualified_lookup – fghj