prezident.mira:
U>>и в C и в C++ разыменование нулевого указателя — UB имхо
PM>К счастью, что есть UB — определяется стандартом, а не чьими-то имхами.
Ну, и какое же behavior для вычисляющегося выражения вроде *(int*)nullptr определяется действующим стандартом C++?
C++14 [expr.unary.op]
The unary * operator performs indirection: the expression to which it is applied shall be a pointer to an object type, or a pointer to a function type and the result is an lvalue referring to the object or function to which the expression points.
(int*)nullptr не указывает на какой-либо объект, и, следовательно, результатом здесь не может быть "an lvalue referring to the object or function to which the expression points". Если результат выполнения этого выражения другой, то какой именно? Если описания поведения нет, то де-юре получаем не что иное, как undefined behavior:
C++14 [defns.undefined]
undefined behavior
behavior for which this International Standard imposes no requirements
[ Note: Undefined behavior may be expected when this International Standard omits any explicit definition of
behavior ....
Де-факто же *(int*)nullptr считается просто no-op, т.е. это один из тех случаев, когда следует руководствоваться _мнением_ отдельных представителей комитета по стандартизации, а не официальным правилам.
Можно привести ещё более интересный пример, где по правилам C++ undefined behavior возникает де-юре:
#include <cstdlib>
int main()
{
void *p = std::malloc(sizeof(int));
*(int *)p; // undefined behavior
std::free(p);
}
Причина та же самая, что и в случае с нулевым указателем: по адресу p нет никаких объектов. Де-факто подразумевается, что такая конструкция должна работать примерно как если бы вызов std::malloc(sizeof(int)) создал неинициализированный объект типа int.