C++ 在C+;中,是否可以根据以后的运行时决策使用不同的隐式对象+;20?
这个问题指的是在本文件中增加的内容 以下是我的例子:C++ 在C+;中,是否可以根据以后的运行时决策使用不同的隐式对象+;20?,c++,language-lawyer,c++20,C++,Language Lawyer,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;
#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]
}
#包括
#包括
void foo(void*p)
{
如果(std::getchar()=='i')
{
*(int*)p=2;
标准::printf(“%d\n”,*(int*)p);
}
其他的
{
*(浮动*)p=2;
标准::printf(“%f\n”,*(float*)p);
}
}
int main()
{
void*a=std::malloc(sizeof(int)+sizeof(float));
如果(!a)返回退出失败;
傅(甲),;
//foo(a);[2]
}
对于最新草案下的所有输入,该代码是否定义良好
P0593中表达的基本原理清楚地表明,如果两个用户输入项不同,取消注释[2]
将导致由于严格的别名冲突而导致未定义的行为。隐式对象创建应该只在malloc
点发生一次;它不是由foo
中的赋值语句触发的
对于程序的任何实际运行,都存在一组未指定的隐式对象的成员,这将使程序定义良好。但是我不清楚在[intro.object]/10中提到的隐式对象创建是否必须在malloc
发生时进行选择;或者决定是否可以“时间旅行”
对于将二进制blob读入缓冲区,然后在运行时决定如何访问它的程序,也可能会出现同样的问题(例如,反序列化;头告诉我们是出现浮点还是整数)
隐式对象创建应该只在malloc
点发生一次;它不是由foo
中的赋值语句触发的
那没有关系。重要的是创建了哪个对象。该标准规定,被创建的对象是一个可以将某些东西生成定义良好的代码的对象:
该操作在其指定的存储区域内隐式创建并启动隐式生存期类型([basic.types])的零个或多个对象的生存期,如果这样做会导致程序具有定义的行为
行为最终基于运行时执行,而不是静态分析。因此,您只需跟踪程序的执行,直到遇到无法定义行为的情况,但如果在相关操作时在该存储中创建了某种类型的对象,则会定义行为
因此,创建位置始终是“操作”,但创建内容的确定取决于运行时内存的使用方式(即:行为)。说得清楚,您是说我的代码定义良好?