gpt4 book ai didi

c++ - "cast to first member of standard layout"类型双关规则是否扩展到数组?

转载 作者:可可西里 更新时间:2023-11-01 18:36:33 25 4
gpt4 key购买 nike

具体来说,我将 C API 包装在一个友好的 C++ 包装器中。 C API 具有这种相当标准的形式:

struct foo {...};
void get_foos(size_t* count, foo* dst);

做的是,通过将类型双关的包装器数组直接传递给 C api 来为自己保存一个额外的拷贝,并保持理智检查 static_assert() .

class fooWrapper {
foo raw_;
public:
[...]
};

std::vector<fooWrapper> get_foo_vector() {
size_t count = 0;
get_foos(&count, nullptr);

std::vector<fooWrapper> result(count);

// Is this OK?
static_assert(sizeof(foo) == sizeof(fooWrapper), "");
static_assert(std::is_standard_layout<fooWrapper>::value, "");
get_foos(&count, reinterpret_cast<foo*>(result.data()));

return result;
}

我的理解是它是有效代码,因为所有访问的内存位置都单独符合规则,但我想确认这一点。

编辑:显然,只要reinterpret_cast<char*>(result.data() + n) == reinterpret_cast<char*>(result.data()) + n*sizeof(foo)是的,它在今天的所有主要编译器下都可以工作。但我想知道标准是否同意。

最佳答案

首先,这不是双关语。 reinterpret_cast你正在做的只是一种改写的方式&result.data().foo_ .类型双关是通过对另一种类型的指针/引用来访问一种类型的对象。您正在访问其他类型的子对象。

其次,这行不通。 Pointer arithmetic is based on having an array (出于指针运算的目的,单个对象充当 1 个元素的数组)。和 vector<T>由 fiat 定义以生成 T 的数组秒。但是 T 的数组不等同于 T 的某个子对象的数组, 即使该子对象的大小与 T 相同和 T是标准布局。

因此,如果get_foos对其给定的 foo 数组执行指针运算s,那是UB。哦当然,它几乎肯定会工作。但语言的答案是 UB。

关于c++ - "cast to first member of standard layout"类型双关规则是否扩展到数组?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/50748285/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com