В чем именно смысл сноски, упомянутой в [expr.ref] / 1?

[Expr.ref] / 1:

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

Другие решения

Других решений пока нет …

По вопросам рекламы [email protected]