Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/cplusplus/155.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C++ 在C+;中,是否可以根据以后的运行时决策使用不同的隐式对象+;20?_C++_Language Lawyer_C++20 - Fatal编程技术网

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])的零个或多个对象的生存期,如果这样做会导致程序具有定义的行为

行为最终基于运行时执行,而不是静态分析。因此,您只需跟踪程序的执行,直到遇到无法定义行为的情况,但如果在相关操作时在该存储中创建了某种类型的对象,则会定义行为


因此,创建位置始终是“操作”,但创建内容的确定取决于运行时内存的使用方式(即:行为)。

说得清楚,您是说我的代码定义良好?