相关疑难解决方法(0)

是否可以根据 C++20 中稍后的运行时决定存在不同的隐式对象?

这个问题是指在最新的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]
}
Run Code Online (Sandbox Code Playgroud)

此代码是否针对最新草案下的所有输入进行了明确定义?

P0593 中表达的基本原理非常清楚[2],如果两个用户输入项不同,取消注释将导致由于严格的别名违规而导致未定义的行为。隐式对象创建应该只发生一次,在malloc; 它不是由foo.

对于程序的任何实际运行,都存在一个未指定的隐式对象集的成员,可以使程序定义良好。但是我不清楚 [intro.object]/10 中提到的隐式对象创建的选择是否必须在malloc发生时进行;或者决定是否可以“时间旅行”。

对于将二进制 blob 读入缓冲区然后做出如何访问它的运行时决定(例如反序列化;并且标头告诉我们是浮点数还是整数即将出现)的程序,可能会出现同样的问题。

c++ language-lawyer c++20

11
推荐指数
1
解决办法
322
查看次数

标签 统计

c++ ×1

c++20 ×1

language-lawyer ×1