Первый случай (возможно) покрывается 3,8 / 6:
до начала срока службы объекта, но после того, как хранилище, которое будет занимать объект, было выделено или, после срока службыобъекта закончился, и до того, как хранилище, в котором занятый объект, будет повторно использовано или освобождено, может использоваться любое значение l, которое относится к исходному объекту, но только ограниченным образом.Такое lvalue относится к выделенному хранилищу (3.7.3.2), и использование свойств lvalue, которые не зависят от его значения, четко определено.
Поскольку все, что вы используете, a
(и other
, что связано с a
) до того, как начало его жизни является адресом, я думаю, что вы хорошо: прочитайте остальную часть этого параграфа для подробных правил.
Осторожнохотя в этом 8.3.2 / 4 говорится: «Ссылка должна быть инициализирована для ссылки на действительный объект или функцию».Существует некоторый вопрос (как отчет о дефектах по стандарту), что означает «действительный» в этом контексте, поэтому, возможно, вы не можете связать параметр other
с неструктурированным (и, следовательно, «недействительным»?) a
.
Итак, я не уверен, что стандарт на самом деле здесь говорит - я могу использовать lvalue, но, возможно, не привязывать его к ссылке, в этом случае a
не хорошо, при передаче указателя на a
все будет в порядке, если только он используется способами, разрешенными 3.8 / 5.
В случае b
, вы используете значение до того, какинициализирован (потому что вы разыменовываете его, а также потому, что даже если вы зашли так далеко, &other
будет значением b
).Это явно нехорошо.
Как всегда в C ++, он компилируется, потому что это не нарушение языковых ограничений, и стандарт явно не требует диагностики.Представьте себе искажения, которые должна пройти спецификация, чтобы назначить диагностику, когда объект недопустимо используется при собственной инициализации, и представьте анализ потока данных, который может потребоваться компилятору для выявления сложных случаев (это может даже не бытьвозможно во время компиляции, если указатель переправляется через внешне определенную функцию).Проще оставить это как неопределенное поведение, если у кого-то нет действительно хороших предложений для нового языка спецификаций; -)