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

Сообщение Re[6]: const reference nullptr от 15.07.2017 14:20

Изменено 15.07.2017 14:25 prezident.mira

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

NI>Можно привести ещё более интересный пример, где по правилам C++ undefined behavior возникает де-юре:


NI>
#include <cstdlib>

NI>int main()
NI>{
NI>    void *p = std::malloc(sizeof(int));
NI>    *(int *)p; // undefined behavior
NI>    std::free(p);
NI>}

NI>Причина та же самая, что и в случае с нулевым указателем: по адресу p нет никаких объектов. Де-факто подразумевается, что такая конструкция должна работать примерно как если бы вызов std::malloc(sizeof(int)) создал неинициализированный объект типа int.

http://eel.is/c++draft/basic.life#6

Before the lifetime of an object has started but after the storage which the object will occupy has been allocated or, after the lifetime of an object has ended and before the storage which the object occupied is reused or released, any pointer that represents the address of the storage location where the object will be or was located may be used but only in limited ways. For an object under construction or destruction, see [class.cdtor]. Otherwise, such a pointer refers to allocated storage ([basic.stc.dynamic.deallocation]), and using the pointer as if the pointer were of type void*, is well-defined. Indirection through such a pointer is permitted but the resulting lvalue may only be used in limited ways, as described below.


Если expression это lvalue, которое referring to/denoting объект — этот объект "существовать" или быть ещё каким-то образом "валидным" не обязан, кроме как в специально оговорённых случаях.
Следует различать "lvalue, denoting object" и сам "object".
Re[6]: const reference nullptr
Здравствуйте, N. I., Вы писали:

NI>Можно привести ещё более интересный пример, где по правилам C++ undefined behavior возникает де-юре:


NI>
#include <cstdlib>

NI>int main()
NI>{
NI>    void *p = std::malloc(sizeof(int));
NI>    *(int *)p; // undefined behavior
NI>    std::free(p);
NI>}

NI>Причина та же самая, что и в случае с нулевым указателем: по адресу p нет никаких объектов. Де-факто подразумевается, что такая конструкция должна работать примерно как если бы вызов std::malloc(sizeof(int)) создал неинициализированный объект типа int.

http://eel.is/c++draft/basic.life#6

Before the lifetime of an object has started but after the storage which the object will occupy has been allocated or, after the lifetime of an object has ended and before the storage which the object occupied is reused or released, any pointer that represents the address of the storage location where the object will be or was located may be used but only in limited ways. For an object under construction or destruction, see [class.cdtor]. Otherwise, such a pointer refers to allocated storage ([basic.stc.dynamic.deallocation]), and using the pointer as if the pointer were of type void*, is well-defined. Indirection through such a pointer is permitted but the resulting lvalue may only be used in limited ways, as described below.


Если expression это lvalue, которое referring to/denoting объект — этот объект "существовать" или быть ещё каким-то образом "валидным" не обязан, кроме как в специально оговорённых случаях.
Следует различать "lvalue, denoting object" и сам "object".

Сюда же пункт 7 http://eel.is/c++draft/basic.life#7

Similarly, before the lifetime of an object has started but after the storage which the object will occupy has been allocated or, after the lifetime of an object has ended and before the storage which the object occupied is reused or released, any glvalue that refers to the original object may be used but only in limited ways. For an object under construction or destruction, see [class.cdtor]. Otherwise, such a glvalue refers to allocated storage ([basic.stc.dynamic.deallocation]), and using the properties of the glvalue that do not depend on its value is well-defined.