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

Ale*_*der 8 c++ language-lawyer member-access

[expr.ref]/1:

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

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

Kei*_*son 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";
}
Run Code Online (Sandbox Code Playgroud)

只有一个s对象,它的值是42,但arr[index()]仍然会对表达式求值,即使它的结果不需要确定它的值s.

输出是:

index returns 5
42
Run Code Online (Sandbox Code Playgroud)