Что именно означает сноска, упомянутая в [expr.ref] / 1?

[expr.ref] / 1:

Постфиксное выражение, за которым следует точка . или стрелка ->, за которым может следовать ключевое слово template (17.2), за которым следует id-expression, является постфиксным выражением. Выражается постфиксное выражение перед точкой или стрелкой; 67 результат этой оценки вместе с id-expression определяет результат всего постфиксного выражения.

67) Если вычисляется выражение доступа к члену класса, оценка подвыражения происходит, даже если результат не нужен для определения значения всего постфиксного выражения, например, если id-expression обозначает статический член.


person Alexander    schedule 13.06.2017    source источник


Ответы (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
person Keith Thompson    schedule 13.06.2017