[expr.ref] / 1中提到的脚注究竟是什么意思?

时间:2017-06-13 19:02:10

标签: c++ language-lawyer member-access

[expr.ref]/1

后缀表达式,后跟点.或箭头->,可选地后跟关键字template(17.2), 然后是 id-expression ,是一个后缀表达式。点或箭头前的后缀表达式 被评估; 67 评估结果与 id-expression 一起确定了结果 整个后缀表达式。

67)如果计算了类成员访问表达式,即使结果不必要,也会发生子表达式求值 确定整个后缀表达式的值,例如,如果 id-expression 表示静态成员。

1 个答案:

答案 0 :(得分:6)

如果某个成员被定义为static,那么该类的成员只有一个副本,而不是该类的每个实例都有一个副本。可以通过类的实例(对象)引用静态成员。脚注澄清了即使您不需要知道正在访问哪个实例对象以了解静态成员的值,也会评估标识实例的表达式(以及任何副作用)。

一个例子:

#include <iostream>

class foo {
    public:
        static int s;
};

int foo::s = 42;

int index() {
    std::cout << "index returns 5\n";
    return 5;
}

int main() {
    foo arr[10];
    std::cout << arr[index()].s << "\n";
}

只有一个s对象,其值为42,但仍然会计算表达式arr[index()],即使其结果不需要确定{{1}的值1}}。

输出结果为:

s