【问题标题】:Understanding non-static class member access了解非静态类成员访问
【发布时间】:2015-02-28 05:57:46
【问题描述】:

我想了解所有允许我们使用:: 运算符来获取访问类数据成员的情况。例如,我们可以使用:: 来访问静态数据成员。其实,

#include <iostream>

struct A
{
    static const int b = 3;
};

int main() { std::cout << A::b << std::endl; }

此外,我们可以使用表达式来访问非静态数据成员的brace-or-equal initializer 内的非静态数据成员。

#include <iostream>

struct A
{
    int b = 3;
    void foo()
    {
        std::cout << A::b << std::endl;
    }
};

int main() { A().foo(); }

DEMO

我正在寻找涵盖我们可以使用:: 运算符的所有情况的规则。 Strandard 的哪一章告诉我们不应该使用:: 来访问这样的非静态数据成员

#include <iostream>

struct A
{
    int b = 3;
};

int main() { std::cout << A::b << std:endl; } //error

【问题讨论】:

  • 称为作用域解析算子。它涵盖在整个标准中,并且可以以多种方式使用。我不认为它们被列举在一个地方。
  • 我不认为引用标准是解释为什么最后一个示例不起作用的最有用的方法。我认为对范围解析运算符和非静态数据成员的基本解释会更合适。
  • 最后一个例子没有意义。它如何知道从哪个实例获取 b。

标签: c++ class


【解决方案1】:

C++14 标准中的 5.1.1.13:

表示非静态数据成员或非静态的 id 表达式 只能使用类的成员函数:

  • 作为类成员访问 (5.2.5) 的一部分,其中对象表达式引用成员的类或从该成员派生的类 类,或
  • 形成指向成员 (5.3.1) 的指针,或
  • 如果该 id 表达式表示非静态数据成员并且它出现在未计算的操作数中。

案例 1 是您试图更具体地说明您的意思的成员。例如a.A::b

案例 2 是您获取成员地址的地方。例如&amp;A::b

案例 3 是未评估的地方。例如sizeof(A::b)

您示例中的A::b 不是这些,因此它是非法的。

【讨论】:

  • 也许我们应该补充一点,这是用来解决多重继承的歧义。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2018-10-05
  • 1970-01-01
  • 2016-02-09
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2012-04-13
相关资源
最近更新 更多