2017-06-13 58 views
6

[expr.ref]/1到底是什么在[expr.ref]/1中提到的脚注的含义是什么?

后缀表达式后面跟着一个点.或箭头->,任选接着进行关键字template(17.2), 然后接着是ID-表达,是一个后缀表达式。评估点或箭头 之前的后缀表达式; 该评价的结果,与ID-表达一起,确定了整个 后缀表达式的结果。

67)如果类成员访问表达式,子表达式评估发生即使结果不需要 确定整个后缀表达式的值,例如如果ID-表达表示静态成员。

回答

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()]仍然评价,即使是不需要它的结果来确定的s值。

输出是:

index returns 5 
42 
+0

感谢。不能说得更清楚。 – Alexander