В С++, что означает "доступ" в строгом правиле псевдонимов?
3.10/10 говорит:
Если программа пытается получить доступ к сохраненному значению объекта через значение gl другого, чем одно из следующих типов, поведение не определено:
Однако термин "доступ" не определен нигде. В этом контексте означает ли это чтение, чтение или изменение?
В стандарте C он однозначно определяется как чтение или изменение. Однако в С++ 11 он, кажется, используется с разными значениями в разное время, например:
1,9/8:
Доступ к неустойчивым объектам оценивается строго в соответствии с правилами абстрактной машины.
Очевидно, что это предназначено для чтения или изменения, однако во многих других местах, таких как 1.10/24:
- доступ или изменение изменчивого объекта или
используется так, как будто это означает только чтение.
Ответы
Ответ 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, плохо сформирована.