Информация об изменениях

Сообщение Re[8]: const reference nullptr от 16.07.2017 0:51

Изменено 16.07.2017 4:33 prezident.mira

Re[8]: const reference nullptr
Здравствуйте, N. I., Вы писали:

NI>prezident.mira:


PM>>

PM>>Before the lifetime of an object has started but after the storage which the object will occupy has been allocated


NI>А если никаких попыток создать объект вообще не предпринимается, это относится к "Before the lifetime of an object has started" или нет? Без авторитетного толкователя это правило можно интерпретировать как хочешь.


Да, я понял. Пока в стандарте не будет написано капсом "N.I.! INDIRECTION ЧЕРЕЗ НУЛЕВОЙ УКАЗАТЕЛЬ — ЭТО НЕ UB!" то Вы всё что угодно будете интерпретировать как Вам угодно.

А по факту http://www.open-std.org/jtc1/sc22/wg21/docs/cwg_closed.html#315 закрыто как NAD (Not A Defect), что значит, что

The working group has reached consensus that the issue is not a defect in the Standard. A Rationale statement describes the working group's reasoning.

и в Rationale у 315 написано

*p is not an error when p is null unless the lvalue is converted to an rvalue


NI> тут хоть как трактуй, получишь undefined behavior


Если интерпретировать как Вам угодно, то UB будет всё, что Вам угодно. А остальным стандарт говорит http://eel.is/c++draft/basic.life#1

The lifetime of an object or reference is a runtime property of the object or reference. An object is said to have non-vacuous initialization if it is of a class or aggregate type and it or one of its subobjects is initialized by a constructor other than a trivial default constructor. The lifetime of an object of type T begins when:

  • storage with the proper alignment and size for type T is obtained, and
  • if the object has non-vacuous initialization, its initialization is complete,

Т.е. тут не UB. Кстати, к предыдущему примеру кода с "UB" этот пункт стандарта тоже относится.

NI> что весьма доставляет, т.к. подобный код широко используется в C.


В C нет конструкторов, там lifetime начинается с обретением storage. И, как видно из приведённого выше пункта стандарта, C++ тут совместим с C в случае тривиальных конструкторов.
Re[8]: const reference nullptr
Здравствуйте, N. I., Вы писали:

NI>prezident.mira:


PM>>

PM>>Before the lifetime of an object has started but after the storage which the object will occupy has been allocated


NI>А если никаких попыток создать объект вообще не предпринимается, это относится к "Before the lifetime of an object has started" или нет?


Это уже попытка придраться на пустом месте. Вам показали, что Вы не правы, Вам стало от этого неприятно и Вы теперь цепляетесь за соломинку.
Там всё ясно написано и оракулов, предсказывающих будущее, для описания текущего поведения стандарт не требует.

NI> Без авторитетного толкователя это правило можно интерпретировать как хочешь.


Да, я понял. Пока не прилетит Страуструп на голубом вертолёте и не скажет: "N.I.! INDIRECTION ЧЕРЕЗ НУЛЕВОЙ УКАЗАТЕЛЬ — ЭТО НЕ UB!" то Вы всё что угодно будете интерпретировать как Вам угодно, лишь бы показаться правым во что бы то ни стало.

А по факту http://www.open-std.org/jtc1/sc22/wg21/docs/cwg_closed.html#315 закрыто как NAD (Not A Defect), что значит, что

The working group has reached consensus that the issue is not a defect in the Standard. A Rationale statement describes the working group's reasoning.

и в Rationale у 315 написано

*p is not an error when p is null unless the lvalue is converted to an rvalue


NI> тут хоть как трактуй, получишь undefined behavior


Если интерпретировать как Вам угодно, то UB будет всё, что Вам угодно. А остальным стандарт говорит http://eel.is/c++draft/basic.life#1

The lifetime of an object or reference is a runtime property of the object or reference. An object is said to have non-vacuous initialization if it is of a class or aggregate type and it or one of its subobjects is initialized by a constructor other than a trivial default constructor. The lifetime of an object of type T begins when:

  • storage with the proper alignment and size for type T is obtained, and
  • if the object has non-vacuous initialization, its initialization is complete,

Т.е. тут не UB. Кстати, к предыдущему примеру кода с "UB" этот пункт стандарта тоже относится.

NI> что весьма доставляет, т.к. подобный код широко используется в C.


В C нет конструкторов, там lifetime начинается с обретением storage. И, как видно из приведённого выше пункта стандарта, C++ тут совместим с C в случае тривиальных конструкторов.