8

[expr.ref]/1

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

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

4

1 回答 1

9

如果一个成员被定义为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()]仍然被计算,即使它的结果不需要确定 的值s

输出是:

index returns 5
42
于 2017-06-13T19:27:05.100 回答