Прежде всего, я видел этот вопрос о C99, а принятый операнд ссылок на ответы не оценивается в стандартном черновике C99. Я не уверен, что этот ответ относится к С++ 03. Там также этот вопрос о С++, который имеет принятый ответ, ссылаясь на аналогичную формулировку, а также в некоторых контекстах появляются неоцененные операнды. Неопределенный операнд не оценивается. формулировка.
У меня есть этот код:
int* ptr = 0;
void* buffer = malloc( 10 * sizeof( *ptr ) );
Вопрос: есть ли разворот нулевого указателя (и, следовательно, UB) внутри sizeof()
?
С++ 03 5.3.3/1 говорит Оператор sizeof дает количество байтов в представлении объекта его операнда. Операндом является либо выражение, которое не оценивается, либо идентификатор типа в скобках.
Связанные с ответами цитируют эту или аналогичную формулировку и используют часть "не оценивается", чтобы вывести там UB.
Однако я не могу найти, где именно стандартная ссылка оценивает наличие или отсутствие UB в этом случае.
"Не оценивает" выражение, к которому применяется sizeof, делает его законным для разыменования нулевого или недопустимого указателя внутри sizeof в С++?