gpt4 book ai didi

c++ - 在 C++ 中返回假对象引用的规则

转载 作者:可可西里 更新时间:2023-11-01 16:38:04 27 4
gpt4 key购买 nike

我想使用自定义容器遍历预分配的 float 组,该容器不拥有数据,但作用于数据的一部分。例如,命名容器类 LinhaSobre :

std::unique_ptr<float[]> data(new float[720]);
...
//creates container to iterate 26 floats starting from from data[12]
LinhaSobre cont(data.get()+12, 26);
//sets those elements to 1.5
for(size_t i = 0; i < cont.size(); i++)
cont[i] = 1.5f;

这是 operator[] 的可能实现:

//...
//LinhaSobre has a member mem0 which is initialized
//as a pointer to where the interval starts
float & LinhaSobre::operator[] (size_t i)
{
return *(mem0+i);
}

请注意,我正在从 LinhaSobre::operator[] 返回一个引用到它不拥有的数据。它不应干扰数据的生命周期(构造函数、析构函数)。

现在我想公开存储的 data通过另一种模式,std::array<float,4> , 而不是纯的 float .示例,将新类命名为 LinhaSobre4f :

std::unique_ptr<float[]> data(new float[720]);
...
//creates container to iterate 4 array<float, 4> starting from from data[12]
LinhaSobre4f l(data.get()+(3*4), 4);
//sets those elements to {1.5f, 2.5f, 3.5f, 4.5f};
for(size_t i = 0; i < l.size(); i++)
l[i] = { {1.5f, 2.5f, 3.5f, 4.5f} };

请注意,我将项目视为一个数组。这会导致容器类发生一些变化,我主要关心的是 operator[] ,这里是完整的类代码:

struct LinhaSobre4f
{
LinhaSobre4f(float * pos_begin, size_t size_):
pos0(pos_begin),
size_(size_){}
std::array<float, 4> & operator[](size_t i)const
{
std::array<float,4> * r =
reinterpret_cast<std::array<float,4>*> (pos0+(4*i));
return *r;
}
size_t size()const
{
return size_;
}
private:
float * pos0;
size_t size_;
};

operator[]返回对被视为 std::array<float,4> 的内存块的引用从来没有真正存在过,但考虑到 std::array内存布局保证,它有效。我对此表示怀疑,可以吗? (除了内存对齐,我保证)。我可以在语义上公开这样的对象吗?正确的说法是什么? (我在标题中使用了假对象)。

Here's a live demo of the example . Here's another (the other link sometimes fails)

最佳答案

C++ 标准(我正在阅读 C++11)定义了一个 std::array 如下:

The conditions for an aggregate (8.5.1) shall be met.

您不能保证 std::array 是 POD。 C++ 标准只保证它是一个类集合。

基于此,我相信您使用 reinterpret_castfloat 的 POD 数组转换为 std::array 是未定义的行为。

它很可能会与您的编译器一起工作,但您不能保证这将是可移植的或合法的。

关于c++ - 在 C++ 中返回假对象引用的规则,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/36489067/

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