[expr.ref]/1中提到的脚注到底是什么意思?
What exactly is the meaning of the footnote mentioned in [expr.ref]/1?
后缀表达式后跟点 .
或箭头 ->
,可选地后跟关键字 template
(17.2),
然后跟着一个id-expression,是一个后缀表达式。点或箭头前的后缀表达式
被评估;67 该评估的结果与 id-expression 一起确定
整个后缀表达式。
67) 如果对 class 成员访问表达式求值,即使结果不需要
确定整个后缀表达式的值,例如,如果 id-expression 表示静态成员。
如果一个成员被定义为 static
,那么 class 只有一个成员副本,而不是 class 的每个实例都有一个副本。可以通过 class 的实例(对象)引用静态成员。脚注阐明了识别实例的表达式被求值(并且会发生任何副作用),即使您不需要知道您正在访问哪个实例对象也能知道静态成员的值。
一个例子:
#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
后缀表达式后跟点 .
或箭头 ->
,可选地后跟关键字 template
(17.2),
然后跟着一个id-expression,是一个后缀表达式。点或箭头前的后缀表达式
被评估;67 该评估的结果与 id-expression 一起确定
整个后缀表达式。
67) 如果对 class 成员访问表达式求值,即使结果不需要 确定整个后缀表达式的值,例如,如果 id-expression 表示静态成员。
如果一个成员被定义为 static
,那么 class 只有一个成员副本,而不是 class 的每个实例都有一个副本。可以通过 class 的实例(对象)引用静态成员。脚注阐明了识别实例的表达式被求值(并且会发生任何副作用),即使您不需要知道您正在访问哪个实例对象也能知道静态成员的值。
一个例子:
#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