В соответствии со стандартом С++ для каждой реализации обязательно указывать "поведение, определяемое реализацией":
1.3.11
[defns.impl.defined]
поведение, определяемое реализациейдля хорошо сформированной программы и правильных данных, которая зависит от реализации и что каждый документ реализации
И чтение недопустимого значения указателя имеет поведение, определяемое реализацией (см. 4.1 Преобразование Lvalue-to-rval [conv.lval]
):
если объект, к которому относится ссылка glvalue, содержит недопустимое значение указателя (3.7.4.2, 3.7.4.3), поведение определяется реализацией.
(цитата из проекта n4527, но словосочетание "Неправильное использование недопустимого значения указателя и передача недопустимого значения указателя функции деаллокации имеют поведение undefined. Любое другое использование недопустимого значения указателя имеет поведение, определяемое реализацией". был в разделе 3.7.4.2. Функции освобождения [basic.stc.dynamic.deallocation]
, поскольку по крайней мере черновик n3485)
Однако многие популярные реализации не определяют это поведение, и многие эксперты описывают это как "поведение undefined".
Вероятная причина отсутствия четкой документации заключается в том, что, насколько я могу судить, оценка "недопустимых значений указателя" отсутствует в "Индекс поведения, определяемого реализацией", который появляется в стандартных черновиках, следующих за приложениями.
Является ли это дефектом в стандарте и существуют ли какие-либо открытые отчеты об ошибках или действия комитета, предпринятые с момента его появления на С++ 14?