Size: a a a

2020 June 27

AT

Alexey Tkachenko in pro.cxx
Aidar Fattakhov
Но null PTR это invalid
Не обязательно
источник

VS

Vlad Serebrennikov in pro.cxx
Aidar Fattakhov
Но null PTR это invalid
вы сами указали на пункт, где дается определение этому термину
источник

VS

Vlad Serebrennikov in pro.cxx
в случае нулевого указателя нет никакого объекта, на который он ссылался, а потом его не стало (мое вольное сокращение)
источник

AF

Aidar Fattakhov in pro.cxx
Alexey Tkachenko
Не обязательно
Null ptr не имеет нулевое binary represent
источник

AF

Aidar Fattakhov in pro.cxx
Там только касты определены
источник

VS

Vlad Serebrennikov in pro.cxx
Aidar Fattakhov
Null ptr не имеет нулевое binary represent
зависит от реализации и не имеет никакого отношения к теме
источник

AT

Alexey Tkachenko in pro.cxx
Aidar Fattakhov
Null ptr не имеет нулевое binary represent
nullptr это вообще не указатель строго говоря
источник

VS

Vlad Serebrennikov in pro.cxx
Alexey Tkachenko
nullptr это вообще не указатель строго говоря
да, это константа
источник

PK

Pavel Kazakov in pro.cxx
Alexey Tkachenko
nullptr это вообще не указатель строго говоря
А что тогда? Семантика как у указателя
источник

VS

Vlad Serebrennikov in pro.cxx
Pavel Kazakov
А что тогда? Семантика как у указателя
тем, чем мы привыкли его воспринимать, он становится после приведения к типу
источник

AT

Alexey Tkachenko in pro.cxx
Pavel Kazakov
А что тогда? Семантика как у указателя
Нечто, что может быть приведено к невалидному указателю
источник

AT

Alexey Tkachenko in pro.cxx
Притом любого типа
источник

PK

Pavel Kazakov in pro.cxx
У него тип nullptr_t
источник

AF

Aidar Fattakhov in pro.cxx
Alexey Tkachenko
nullptr это вообще не указатель строго говоря
Я не про nullptr_t
источник

AF

Aidar Fattakhov in pro.cxx
Vlad Serebrennikov
в случае нулевого указателя нет никакого объекта, на который он ссылался, а потом его не стало (мое вольное сокращение)
Я ничего ее нашел
Вобще строго говоря такая трактовка не обязательно указывает на то что объект когдато был
Еще тут
http://eel.is/c++draft/expr.unary#op-1 написано что результатом является ссылка на объект, но объекта там очевидно нет
источник

AD

Andrey Davydov in pro.cxx
Vlad Serebrennikov
Что, кажется, удалось выяснить к настоящему моменту:
Пример 1
Согласно expr.unary.op.1, разыменование возвращает an lvalue referring to the object or function to which the expression points. Есть трактовка, что раз объекта нет, то UB, но, например, dangling ссылки сами по себе не UB несмотря на то, что исходного объекта нет. Еще есть довольно старая CWG issue 232, где CWG пришла к неформальному консенсусу, что p = 0; *p; is not inherently an error. Полагаю, что в этом примере UB нет.

Пример 2
Видно две потенциальные возможности UB. Разыменование освещено в предыдущем примере, поэтому здесь сфокусируюсь на операторе запятая. Согласно expr.comma.1, операнды вычисляются слева направо, и то, что вернуло разыменование, становится discarded-value выражением. Неформальный консенсус в CWG issue 232 также в том, что an lvalue-to-rvalue conversion would give it undefined behavior, но и его не происходит, потому что о volatile речь у нас нигде не идет (expr.context-2), не говоря о том, что в текущем тексте стандарта этот консенсус, кажется, тоже не отражен: в conv.lval из релевантного только the value contained in the referenced object is not accessed, что наоборот предупреждает возможность UB (basic.lval.11). Полагаю, что UB нет и здесь.

Пример 3
Полагаю, здесь UB начнется самое позднее на попытке доступа к несуществующему объекту под p внутри конструктора копирования согласно basic.lval.11.

Пример 4
Полагаю, здесь UB начнется в момент вызова функции-члена у несуществующего объекта согласно class.mfct.non-static.1.

Пример 5
Если предположить, что разыменование, которое происходит согласно 59 сноске, само по себе допустимо, то далее я не нахожу требований, чтобы сам объект существовал, и, соответственно, причин для UB.
Компиляторы в общем-то согласны с вашими выводами: https://gcc.godbolt.org/z/zGP8C-
источник

VS

Vlad Serebrennikov in pro.cxx
Aidar Fattakhov
Я ничего ее нашел
Вобще строго говоря такая трактовка не обязательно указывает на то что объект когдато был
Еще тут
http://eel.is/c++draft/expr.unary#op-1 написано что результатом является ссылка на объект, но объекта там очевидно нет
1) да, про объекты я упростил. там явно написано when the end of the duration of a region of storage is reached..., а в нашем случае нулевого указателя никакого storage не было и, подозреваю, быть не могло

2) в expr.unary.op.1 описано в первую очередь поведение. можно ли воспринимать его как условие какого-либо рода — ключевой вопрос во всем обсуждении разыименования нулевого указателя

3) я считаю, что если бы там было написано так, как вы говорите, то формулировка была бы reference to the object. более того, в примечании дальше говориться, что the lvalue thus obtained can be used in limited ways (to initialize a reference, for example), что недвусмысленно намекает, что возвращается оттуда не ссылка
источник

CD

Constantine Drozdov in pro.cxx
Aidar Fattakhov
Я ничего ее нашел
Вобще строго говоря такая трактовка не обязательно указывает на то что объект когдато был
Еще тут
http://eel.is/c++draft/expr.unary#op-1 написано что результатом является ссылка на объект, но объекта там очевидно нет
Там Андрей вроде устроил /thread этим примером
https://t.me/ProCxx/390964
источник

AF

Aidar Fattakhov in pro.cxx
я считаю гуманитариям нужно перестатьт писать технические документы
источник

VS

Vlad Serebrennikov in pro.cxx
Andrey Davydov
Компиляторы в общем-то согласны с вашими выводами: https://gcc.godbolt.org/z/zGP8C-
хороший аргумент, спасибо
(нужно было самому догадаться)
источник