Подтвердить что ты не робот

В С++, что означает "доступ" в строгом правиле псевдонимов?

3.10/10 говорит:

Если программа пытается получить доступ к сохраненному значению объекта через значение gl другого, чем одно из следующих типов, поведение не определено:

Однако термин "доступ" не определен нигде. В этом контексте означает ли это чтение, чтение или изменение?


В стандарте C он однозначно определяется как чтение или изменение. Однако в С++ 11 он, кажется, используется с разными значениями в разное время, например:

1,9/8:

Доступ к неустойчивым объектам оценивается строго в соответствии с правилами абстрактной машины.

Очевидно, что это предназначено для чтения или изменения, однако во многих других местах, таких как 1.10/24:

  • доступ или изменение изменчивого объекта или

используется так, как будто это означает только чтение.

4b9b3361

Ответ 1

Это должно означать как чтение, так и запись, или правило не будет означать много. Рассмотрим пример из http://blog.llvm.org/2011/05/what-every-c-programmer-should-know.html:

float *P;
void zero_array() {
   int i;
   for (i = 0; i < 10000; ++i)
       P[i] = 0.0f;
}

Приведенный выше примерный код можно оптимизировать в memset, только если компилятор может предположить, что ни одна из P[i] алиасов P. Но рассмотрим мир, в котором только чтение из запрещенного glvalue является UB, тогда приведенный выше код не будет вызывать UB, даже если P[i] aliases P для некоторого i - например, если кто-то сделал P = (float *) &P;, потому что все читает из P являются совершенно законными - все они используют выражение lvalue P.


Изменить: CWG-проблема 1531 находится прямо на месте. Проблема была перенесена в отчет DR (отчет о дефектах) в апреле 2013 года, но решение по какой-либо причине не было применено к рабочему документу.

Ответ 2

Я не утверждаю, что я юрист языка. Однако...

Я бы интерпретировал выражение "доступ к сохраненному значению объекта" как " читать хранимое значение объекта".

Эта интерпретация имеет больше смысла, учитывая предыдущий параграф, в котором говорится об изменении объекта.

9 Если выражение может быть использовано для изменения объекта, к которому он относится, выражение называется модифицируемым. Программа, которая пытается изменить объект через немодифицируемое выражение lvalue или rvalue, плохо сформирована.