2

次の引用の意味を理解しようとしています (3.4.3/3 N3797):

修飾 ID に続く名前は、メンバーのクラスまたは名前空間のスコープで検索されます。

namespace A
{
    class C
    {
    public:
        static const int a=7;
        static int b;
    };
}

int A::C::b=a; //7

のスコープは、の宣言ポイントが続く宣言領域のみstatic int b;で構成されます。実際:b

クラスで宣言された名前の潜在的なスコープは、名前の宣言ポイントに続く宣言領域だけでなく、すべての関数本体、デフォルト引数、例外仕様、および 非静的のブレースまたはイコール初期化子からも構成されます。そのクラスのデータ メンバー

これstatic const int a=7;は、 が のスコープに属していないことを意味しstatic int b;ます。したがって、static const int a=7は では見つかりませんint A::C::b=a;

それは標準のタイプミスですか、それとも私の誤解ですか?

4

3 に答える 3

2

これは static const int a=7; を意味します。static int b; のスコープに属していません。したがって、静的 const int a=7 は int A::C::b=a; で見つかりません。

クラスで宣言された名前の潜在的なスコープには、非静的データメンバーの関数本体なども含まれます。これは上記の引用と競合しません。静的データ メンバーの宣言領域 (およびスコープ) には、それ自体で宣言されたクラスのスコープがまだ含まれています。

関連する部分を自分で引用しました:

修飾 ID に続く名前は、メンバーのクラスまたは名前空間のスコープで検索されます

したがって、このコードスニペットでは

int A::C::b=a;

adeclarator-id の後に使用されると、クラス内で検索されて見つかります。

于 2014-06-04T13:00:05.533 に答える
0

引用は、「メンバーのスコープ」ではなく、「メンバーのクラスのスコープ」を示しています。soaは のクラス スコープで検索されCます。の後に宣言されているかどうかに関係なく、そこにありbます。

于 2014-06-04T12:59:54.650 に答える
0

引用したルール (3.3.7p1 の項目 1) は、クラス内で使用される名前を対象としています。

namespace A
{
    class C
    {
    public:
        int b = a;
        static const int a=7;
    };
}

リストしたコードを許可するルールは、同じ段落の項目 5 です。

5) クラス定義の末尾まで、またはそれを超えて拡張される宣言の潜在的なスコープは、メンバーがクラスの外で語彙的に定義されている場合でも、そのメンバー定義によって定義された領域にも拡張されます [...]

3.3.7p1 の適用項目 1 と 5 の間には明らかに一部の重複がありますが、重複する場所でも同じ効果があるため、それは問題ではありません。

3.4.3p3 は 3.3.7p1 項目 5 と同じことを言っていますが、言葉遣いが異なります。これは、 qualified-idの前に現れる型が「 [the] member definition によって定義された領域」の一部ではないことを明確にします。

于 2014-06-04T13:03:03.950 に答える