次のプログラムは、clang でコンパイルしてもエラーになりません。
namespace X {
struct i {};
}
namespace Y {
using X::i;
struct i {};
}
int main() {}
struct の代わりに int を使用すると、次のようになります。
namespace X {
int i;
}
namespace Y {
using X::i;
int i;
}
int main() {}
このプログラムは、clang でコンパイルすると再定義エラーになります。
プログラム間の唯一の違いは、使用されるエンティティの種類 (struct または int) ですが、一方はエラーなしでコンパイルされ、もう一方は再定義エラーが発生します。
これはclangのバグを示していますか? たぶん、宣言の使用に関しては、再定義とは何かという標準があいまいです。しかし、コンパイラはその解釈を一貫して行うべきではありませんか?
プログラムは次の場所でコンパイルできます。