将左值引用存储到动态分配的数组中

时间:2012-07-07 10:40:45

标签: c++

考虑以下自定义数组类

template <typename element, unsigned int size>
class array
{
private:
    element (&data)[size];
public:
    array(element (&reference)[size]):data(reference){}
    array():data(new element [size]){} // This is where my problem arises
};

显然,在初始化构造函数列表中,将rvalue表达式( new-expression )计算为指针的 rvalue而不是引用类型 。因此,在MSVC(Microsoft Visual Studio 2012 RC)中,会提示有关从 元素* 元素(&amp;)[size]的类型转换的错误

但是,我认为如果我可以将rvalue从指针转换为引用,它应该编译。有没有机会我可以在构造函数的初始化列表中进行它?或许它只是与C ++语言原理的所有冲突?我已经投入 reinterpret_cast ,但我发现相关的唯一规则是

  

“T1类型的 左值表达式 可以转换为引用   另一种类型T2。结果是lvalue或xvalue指的是   与原始左值相同的对象,但具有不同的类型。“ - cppreference.com

明确指出转换适用于 左值表达式

好的,我知道你现在可能会想到什么 - 为什么你需要这类自定义数组?为什么不只是复合指针而不是问题参考?嗯......你总是需要不同的方法来选择才能知道最好的不是吗?

2 个答案:

答案 0 :(得分:2)

关于C ++ 11和rvalue引用的内容是什么?要获得指针指向的值的左值表达式,只需使用一元*运算符。它从一开始就是语言的一部分。你所要做的就是确保得到一个指向数组的指针,而不是指向数组第一个元素的指针。

template <typename element, unsigned int size>
class array
{
private:
    element (&data)[size];
public:
    array() : data(*new element[1][size]) { }
    array(element (&reference)[size]) : data(reference) { }
};

正如Mat在他的评论中所提到的,这里的无参数构造函数是一个非常糟糕的主意,因为内存不会被释放。希望有一个工作代码示例可以让您进行一些实验并得出相同的结论。

答案 1 :(得分:0)

在此代码中,您根本不使用R值引用。 && r值符号没有一次使用。

修改

template <typename element, unsigned int size> 
class array 
{ 
private: 
    element (&data)[size]; 
    static element DefaultArrRef[size];
public: 
    //array(element (&reference)[size]):data(reference){} 
    array():data(DefaultArrRef){}
}; 


template <typename element, unsigned int size> 
element array<element,size>::DefaultArrRef[size];