1

[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 つのコンパイラのいずれでもこの結果が得られないのはなぜですか?

4

1 に答える 1

1

using ディレクティブは、名前が表示されるスコープで名前を可視にします。たとえば、[basic.scope.namespace]p1

メンバーの名前空間を指定する各using ディレクティブについて、メンバーの潜在的なスコープには、メンバーの宣言ポイントに続くusing ディレクティブの潜在的なスコープの部分が含まれます。

ここで、名前のスコープは、その名前 (その名前の宣言) を非修飾ルックアップで見つけることができるプログラムの一部です。

同様に、[namespace.udir]p2 で、

using-directiveは、指定された名前空間の名前が using-directive の後に using-directive が現れるスコープで使用できることを指定ます。

これは基本的に上記の引用と同じことを言っています。

OP では、using-directiveが名前空間 Y の namespace-scope に表示されます。mainはその範囲外であるため、using-directiveは 内で実行される名前検索には影響しませんmain

于 2015-07-18T19:59:12.883 に答える