成员函数体内的类成员访问

时间:2014-08-15 05:56:40

标签: c++ class language-lawyer member

以下简单的代码示例对我产生了一些疑问:

#include <iostream>
using namespace std;

struct A
{
    int a;
    A(int a)
    {
        A::a = a; //It is unclear, because in that case we're applying 
                  //scope resolution operator to A and does.

        this -> a = a; //It is clear, because this points to the current object.
    }
};

int main()
{
    A a(4);
    cout << a.a;
}

demo

我知道3.4.3.1/3节说:

  

在嵌套声明性区域中由名称隐藏的类成员名称   如果合格,仍然可以找到派生类成员的名称   通过其类的名称后跟:: operator。

但它没有指定名称通过&#34;符合条件的名称查找&#34; (例如,在我的情况下为A::a)在成员函数内部应表示当前对象的成员。 我正在寻找标准中的相关参考。

2 个答案:

答案 0 :(得分:0)

在搜索特定于非静态类成员函数的内容时,您应首先查看管理...非静态类成员函数的子句。 §9.3.1[class.mfct.non-static] / p3:

  

id-expression (5.1)不属于类成员访问时   语法(5.2.5)并不用于形成指向成员(5.3.1)的指针   在可以使用X的上下文中,在类this的成员中使用   (5.1.1),如果名称查找(3.4)解析 id-expression 中的名称   到某个类C的非静态非类型成员,如果是    id-expression 可能已评估或CX或基类X,    id-expression 转换为类成员访问表达式   (5.2.5)使用(*this)(9.3.2)作为左侧的后缀表达式   .运算符。 [注意:如果C不是X或基类X,则该类   成员访问表达式格式不正确。 - 结束记录]同样在期间   名称查找,当a的定义中使用 unqualified-id (5.1)时   类X的成员函数解析为静态成员,枚举器   或嵌套类型的类X或基类X,    unqualified-id 转换为 qualified-id (5.1),其中    nested-name-specifier 命名成员函数的类。

答案 1 :(得分:0)

C ++。11§5.1.1¶8

  

nested-name-specifier 表示一个类,可选地后跟关键字template(14.2),然后是该类的成员名称(9.2) )或其基类之一(第10条),是 qualified-id ; 3.4.3.1描述了出现在 qualified-ids 中的类成员的名称查找。结果是成员。结果的类型是成员的类型。如果成员是静态成员函数或数据成员,则结果是左值,否则为prvalue。

相关问题