繁体   English   中英

了解非静态类成员访问

[英]Understanding non-static class member access

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

#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

C ++ 14标准中的5.1.1.13:

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

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

在情况1中,您试图更具体地说明您的意思。 例如aA::b

情况2是您获取会员地址的地方。 例如&A::b

情况3是未评估的情况。 例如sizeof(A::b)

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

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM