Постфиксное выражение, за которым следует точка .
или стрела ->
, за которым может следовать ключевое слово template
(17.2),
а затем следуют ID-выражение, это постфиксное выражение Постфиксное выражение перед точкой или стрелкой
оценивается;67 результат этой оценки, вместе с ID-выражение, определяет результат
все постфиксное выражение.
67) Если вычисляется выражение доступа к члену класса, оценка подвыражения происходит, даже если результат не нужен
определить значение всего выражения постфикса, например, если ID-выражение обозначает статический член.
Если член определен как 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
Других решений пока нет …