Этот вопрос относится к добавлению P0593 к последней версии C ++ 20 .
Вот мой пример:
#include <cstdlib>
#include <cstdio>
void foo(void *p)
{
if ( std::getchar() == 'i' )
{
*(int *)p = 2;
std::printf("%d\n", *(int *)p);
}
else
{
*(float *)p = 2;
std::printf("%f\n", *(float *)p);
}
}
int main()
{
void *a = std::malloc( sizeof(int) + sizeof(float) );
if ( !a ) return EXIT_FAILURE;
foo(a);
// foo(a); [2]
}
Правильно ли определен этот код для всех входных данных по последнему черновику?
Обоснование, выраженное в P0593, довольно ясно показывает, что раскомментирование [2]
приведет к неопределенному поведению из-за строгого нарушения псевдонимов, если два элементы ввода пользователя отличаются. Предполагается, что создание неявного объекта происходит только один раз, в точке malloc
; он не запускается оператором присваивания в foo
.
. Для любого фактического запуска программы существует член неопределенного набора неявных объектов, который делает программу хорошо определенной. Но мне не ясно, нужно ли делать выбор неявного создания объекта, упомянутого в [intro.object] / 10, когда происходит malloc
; или может ли решение «путешествовать во времени».
Та же проблема может возникнуть для программы, которая считывает двоичный двоичный объект в буфер, а затем принимает решение во время выполнения о том, как получить к нему доступ (например, десериализация и заголовок). говорит нам, подходит ли float или int).