(В отношении этот вопрос и ответ.)
До стандарта С++ 17 следующее предложение было включено в [basic.compound]/3:
Если объект типа T расположен по адресу A, указатель типа cv T *, значение которого является адресом A, называется указывать на этот объект, независимо от того, как это значение было получено.
Но поскольку С++ 17, это предложение было удалено.
Например, я считаю, что это предложение определило этот пример кода и что поскольку С++ 17 это поведение undefined:
alignas(int) unsigned char buffer[2*sizeof(int)];
auto p1=new(buffer) int{};
auto p2=new(p1+1) int{};
*(p1+1)=10;
До С++ 17 p1+1
содержит адрес *p2
и имеет правильный тип, поэтому *(p1+1)
является указателем на *p2
. В С++ 17 p1+1
является указателем past-the-end, поэтому он не является указателем на объект, и я считаю, что это не разыменовываемый.
Является ли эта интерпретация этой модификации стандартного права или существуют другие правила, которые компенсируют удаление цитируемого предложения?