В чем именно смысл сноски, упомянутой в [expr.ref]/1?
Постфиксное выражение, за которым следует точка .
или стрела ->
, за которым может следовать ключевое слово template
(17.2), за которым следует id-выражение, является постфиксным выражением. Постфиксное выражение перед точкой или стрелкой оценивается;67 результат этой оценки вместе с выражением id определяет результат всего выражения postfix.
67) Если вычисляется выражение доступа к члену класса, оценка подвыражения происходит, даже если в результате нет необходимости определять значение всего выражения постфикса, например, если id-выражение обозначает статический член.
1 ответ
Если член определен как 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