Рассмотрим следующий код:
namespace foo {
namespace bar {
class foo {};
}
class baz {};
}
using namespace foo::bar;
::foo::baz mybaz;
Является ли этот код действительным?
Или ::foo
неоднозначный?
Или ::foo
ссылается на class foo
, так что нет ::foo::baz
.
Когда дело доходит до компиляторов, gcc 6.1.1
кажется, думает последнее:
scope.cpp:9:8: error: ‘baz’ in ‘class foo::bar::foo’ does not name a type
::foo::baz mybaz;
^~~
С другой стороны, gcc 5.3.1
, clang 3.8.0
, а компилятор Intel 16.0.3 не дает никаких предупреждений или ошибок.
Я подозреваю, что в соответствии с 3.4.3.2.2 стандарта С++ 14 это должно быть допустимым, а не двусмысленным, но я не совсем уверен.
Изменить: кроме того, для foo::baz mybaz
только clang сообщает о неоднозначной ошибке.