在C++中返回伪对象引用的规则

Kah*_*ler 9 c++ reference dereference c++11 semantics

我想迭代一个预先分配的浮点数组,该数组包含一个不拥有数据的自定义容器,但是对它的一部分起作用.例如,命名容器类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;
Run Code Online (Sandbox Code Playgroud)

这是一个可能的实现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);
}
Run Code Online (Sandbox Code Playgroud)

请注意,我正在返回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} };
Run Code Online (Sandbox Code Playgroud)

请注意,我将项目视为数组.这会导致容器类的一些变化,我主要关心的是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_;
};
Run Code Online (Sandbox Code Playgroud)

operator[]作为一个处理一个内存块的基准收益std::array<float,4>是根本不存在这样,但考虑到std::array内存布局担保,它的工作原理.我对此持怀疑态度,可以吗?(除了记忆对齐,我保证).我是否允许在语义上暴露这样的物体?这个的正确用语是什么?(我在标题中使用了假对象).

这是一个示例的现场演示.这是另一个(另一个链接有时会失败)

Sam*_*hik 5

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

应满足总量(8.5.1)的条件.

您不能保证a std::array是POD.C++标准仅保证它是类聚合.

基于此,我相信您reinterpret_castfloats 的POD数组转换为a的用法std::array是未定义的行为.

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