这个问题是指在最新的C ++ 20草案中增加了P0593。
这是我的示例:
#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
发生时进行选择;或决定是否可以“时间旅行”。
对于将二进制Blob读入缓冲区,然后做出如何访问它的运行时决策的程序,可能会出现相同的问题(例如,反序列化;并且标头会告诉我们是否出现了float或int)。