C++ 什么名称查找规则适用于静态常量数据成员定义中的名称

C++ 什么名称查找规则适用于静态常量数据成员定义中的名称,c++,class,static,member,C++,Class,Static,Member,在数据成员的合格id之后,有一个引用描述的名称查找应用于常量静态数据成员的数据成员: class A { static const int i = x;//x is a name defined an arbitrary const int }; 秒。3.4.1/13: 类X的静态数据成员定义中使用的名称 (9.4.2)(在静态构件的合格id之后)查找为 如果在X的成员函数中使用了该名称 但我们可以定义类内静态常量数据成员: class A { static const int

在数据成员的合格id之后,有一个引用描述的名称查找应用于常量静态数据成员的数据成员:

class A
{
    static const int i = x;//x is a name defined an arbitrary const int
};
秒。3.4.1/13:

类X的静态数据成员定义中使用的名称 (9.4.2)(在静态构件的合格id之后)查找为 如果在X的成员函数中使用了该名称

但我们可以定义类内静态常量数据成员:

class A
{
    static const int i = x;//x is a name defined an arbitrary const int
};
美国证券交易委员会的规则。3.4.1/13不适用于名称
x
查找实际将应用什么规则?请参考标准中的相应条款。

例如,以下代码是有效的:

#include <stdio.h>

const int a=5;
class A
{
public:
    static const int b=a;//b is unqualified-id of this data-member
};

int main(){ printf("%d\n",A::b); } //5
#包括
常数INTA=5;
甲级
{
公众:
static const int b=a;//b是此数据成员的非限定id
};
int main(){printf(“%d\n”,A::b);}//5
以下代码也有效:

#include <stdio.h>

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

int main(){ printf("%d\n",A::b); } //7
#包括
甲级
{
公众:
静态常数INTA=7;
静态常数int b=a;
};
int main(){printf(“%d\n”,A::b);}//7
但以下内容无效:

#include <stdio.h>

class A
{
public:
    static const int b=a; //error: a was not declare in this scope.
    static const int a=7;
};

int main(){ printf("%d\n",A::b); }
#包括
甲级
{
公众:
static const int b=a;//错误:a未在此范围内声明。
静态常数INTA=7;
};
int main(){printf(“%d\n”,A::b);}

尚不清楚应用于查找
a

的规则静态数据成员的类内声明不是定义,即使它包含初始值设定项。因此§3.4.1/13不适用于您的示例

类作用域中的名称查找由作用域到达类作用域的规则定义。§3.3.7/1.1:

  • 类中声明的名称的潜在作用域不仅包括名称声明点后面的声明区域, 还有所有函数体,默认参数, 例外规范,以及 该类中的非静态数据成员(包括嵌套 课程)

  • 类S中使用的名称N应在其上下文中引用同一声明,并在S.No.的完整范围内重新评估时引用 违反此规则需要进行诊断

  • 如果对类中的成员声明进行重新排序会产生(1)和(2)下的替代有效程序,则该程序是格式错误的,否 需要进行诊断

  • 这些规则的目的是允许成员函数访问稍后在类中声明的成员变量。由于规则未提及静态数据成员的初始值设定项,因此静态数据成员的名称查找默认为3.4.1/7:

    在成员外部定义类X时使用的名称 函数体、默认参数、异常-规范、, 非静态数据成员的大括号或相等初始值设定项,或嵌套 类别定义应以以下方式之一声明:

    该列表本质上归结为“名称必须是同一类的成员,或在封闭范围内声明。”在第一个示例中,
    a
    在封闭的命名空间中声明,因此可以找到它。在第二个示例中,
    a
    在使用前声明

    但在第三个示例中,它是在声明之前使用的,这是非法的-如果在封闭的名称空间中声明了某个
    a
    ,则由于3.3.7/1.2,它将是未定义的行为

    #include <stdio.h>
    
    const int a=5;
    class A
    {
      public:
        static const int b=a; // The quote corresponds to the lookup for a.
                              // It says that the lookup logic for a is the same
                              // as the lookup for a name in a member function of A
    };
    
    当你使用

        static const int b = a;
    

    从函数
    foo
    中查找
    a
    将是(2)和(3),因为
    a
    不能是局部变量。

    在您的案例中定义了
    x
    在哪里?很明显,它不可能在任何地方。我不明白这个问题;您引用的文本表示查找与
    void member(){x;}
    的查找相同。“你是在问如何在成员函数中查找名称吗?”Praetorian x在某处定义。我想了解范围的后续部分查找了名称x。@MattMcNabb No.Quote说,此查找与qualified-id相同。但是,使用静态常量数据成员的非限定id进行查找如何?您将限定和非限定查找与限定id相混淆。后者,在该Quote中,是指静态数据成员标识符(
    i
    ),当您提供定义时,需要使用类名(和命名空间名)限定该标识符,例如,
    const int NS::a::i-因此短语qualified-id.§3.4.1/13表示§3.4.1/8下列出的规则将用于查找
    x
    。那么,我的示例将应用什么规则?我不明白,谢谢!我理解你。