[namespace.udir]p2 の意味について少し混乱しています。次のプログラムを検討してください。
namespace X { int i = 1; }
namespace Y { using namespace X; }
int main() { i = 2; }
メインの名前検索iが失敗します(GCC、Clang、およびビジュアルc ++で試しました)。これは [namespace.udir]p2 ( http://eel.is/c++draft/dcl.dcl#namespace.udir-2 )と一致していないようです:
using-directive は、指定された名前空間の名前が、using-directive の後に using-directive が現れるスコープで使用できることを指定します。非修飾名ルックアップ ([basic.lookup.unqual]) の間、名前は、using ディレクティブと指定された名前空間の両方を含む、最も近い外側の名前空間で宣言されているかのように表示されます。[ 注: このコンテキストで「含む」とは、「直接的または間接的に含む」ことを意味します。— エンドノート]
私のプログラムでは、 inでi宣言された name にこのルールを次のように適用しています。int i = 1;X
using ディレクティブ:
using namespace X;指名された名前空間:
X最も近い外側の名前空間: グローバル名前空間
iこれは、 inの非修飾名検索でmainが見つかることを意味していませんX::iか? 試した 3 つのコンパイラのいずれでもこの結果が得られないのはなぜですか?