6

次のプログラムは、C++ 標準に従って整形式ですか、それとも整形式ではありませんか?

namespace N { int i; }
using namespace N;
using ::i;
int main() {}

さまざまなコンパイラでさまざまな結果が得られます。

このプログラムは、C++ 標準に従って整形式ですか、それとも整形式ではありませんか? C++ 標準への参照が必要です。

バグを報告する必要があるコンパイラを見つけようとしています。

4

2 に答える 2

4

GCCは間違っています。修飾名の検索では考慮されN::iます。§3.4.3.2/2 & /3:

名前空間Xと namemの場合、名前空間で修飾されたルックアップ セット は次S(X, m)のように定義されます 。が空でない場合は; それ以外の場合は、 in の using ディレクティブによって指定されたすべての名前空間i とそのインライン名前空間セットのiの和集合です。 与えられた(はユーザー宣言された名前空間)、または与えられた( はグローバル名前空間)、[…]メンバーが 1 つだけある場合、または参照のコンテキストが使用宣言 (7.3.3) である場合、S'(X, m)mXXS'(X, m)S(X, m)S'(X, m)S(X, m)S(N, m)NX

X::mX::mXS(X, m)S(X, m)の宣言の必須セットですm

プログラムの using ディレクティブによって指定される名前空間は 1 つだけです: N. したがって、ユニオンに含まれ、 に::i解決されN::iます。

GCC はルックアップと矛盾していることに注意してください::i。別のコンテキストで使用しても問題ありません。

namespace N { int i; }
using namespace N;

int main() {
    ::i = 5;
}

これはコンパイルされます。using 宣言がコンテキストとして行う唯一の違いは、上記の引用に示されているものであり、確立された結論には影響しません。

于 2015-07-25T17:12:15.897 に答える