Следующая программа не выдает ошибку при компиляции с помощью clang:
namespace X {
struct i {};
}
namespace Y {
using X::i;
struct i {};
}
int main() {}
Давайте использовать int вместо struct, тогда мы получим:
namespace X {
int i;
}
namespace Y {
using X::i;
int i;
}
int main() {}
Эта программа выдает ошибку переопределения при компиляции с помощью clang.
Единственная разница между программами заключается в типе используемой сущности (struct или int), но одна компилируется без ошибок, а другая выдает ошибку переопределения.
Это указывает на ошибку в Clang? Возможно, стандарт неоднозначен, что такое переопределение, когда речь идет об использовании-объявлений. Но не должен ли компилятор делать свою интерпретацию последовательно?
Программы можно скомпилировать здесь:
Как сказал Игорь Тандетник, он плохо сформирован из-за [basic.scope.declarative] / 4 и в clang есть ошибка.
Ошибка была подтверждена и исправлена. Увидеть: https://llvm.org/bugs/show_bug.cgi?id=24033