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

[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
Другие вопросы по тегам