C++ 将左值引用存储到动态分配的数组
考虑以下自定义数组类C++ 将左值引用存储到动态分配的数组,c++,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 probl
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
};
模板
类数组
{
私人:
元素(和数据)[大小];
公众:
数组(元素和引用)[size]):数据(引用){}
array():data(新元素[size]){}//这就是我的问题所在
};
显然,在构造函数的初始化列表中,将右值表达式(新表达式)计算为指针的右值,而不是引用类型。因此,在MSVC(Microsoft Visual Studio 2012 RC)中,提示从元素*到元素(&)[size]的类型转换错误
但是,我认为如果我可以将右值从指针转换为引用,它应该可以编译。我有没有可能在构造函数的初始化列表中找到它?或者它只是与C++语言的原理冲突?我已经研究过如何重新解释演员阵容,但我发现唯一相关的规则是
“T1类型的左值表达式可以转换为对的引用
另一种类型T2。结果是一个左值或xvalue,表示
与原始左值相同的对象,但类型不同。“-cppreference.com
这清楚地表明转换适用于左值表达式
好的,我知道您现在可能会怎么想-为什么您需要这样的自定义数组类,为什么不使用复合指针而不是有问题的引用?嗯……在知道最好的方法之前,你总是需要选择不同的方法,不是吗?关于C++11和右值引用的这是什么?要获得指针指向的值的左值表达式,只需使用一元
*
运算符。它从一开始就是语言的一部分。这里需要做的就是确保获得指向数组的指针,而不是指向数组第一个元素的指针
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) { }
};
模板
类数组
{
私人:
元素(和数据)[大小];
公众:
数组():数据(*新元素[1][size]){
数组(元素和引用)[size]):数据(引用){}
};
正如Mat在评论中提到的,这里的无参数构造函数是一个非常糟糕的主意,因为内存不会被释放。希望有一个工作的代码示例可以让您进行一点实验并得出相同的结论。您在这段代码中根本没有使用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];
模板
类数组
{
私人:
元素(和数据)[大小];
静态元素DefaultArrRef[size];
公众:
//数组(元素和引用)[size]):数据(引用){}
数组():数据(DefaultArrRef){}
};
模板
元素数组::DefaultArrRef[size];
让我们想象一下,您可以通过某种方式将新建的结果转换为适合您的用例。你怎样才能正确地删除它呢?这个问题与右值引用无关,我也看不出C++11有什么特别之处。@Mat你说得对;实际上,类中有一个标志,指示数据是否是包装的引用。如果它包装,它不会删除。否则,它会。这不是我为了方便而在这里发布的类。@Yang:这是一种反模式。您应该重新设计,以便类执行任务,而不必关心是否释放内存。@DavidRodríguez dribea因为有一种情况下,这种模式很有用。假设基于C++和用户的动态或弱类型语言的发明在声明该数组类型的变量时不期望新的或删除的,必须在构造时管理内存分配。尽管如此,我当然不会在严肃的工作中使用它:-)。您将数据定义为数组,而不是数组的引用。这是一个好主意,但与所问的大不相同。您的意思是:int(&ref_数组)[10]代码>-这是不可能的。这是完全有效的,并且正是问题所在。@Ajay hvd准确地告诉我们。这个类包含的是一个引用,而不是数组本身。这仍然与问题中的代码完全不同。在这种方法中,调用默认构造函数的array
的所有实例都将共享同一个数组,而在问题中的代码中,每个实例都拥有自己的独立数据。嗯……我猜是其他人。谁会删除内存?为什么我的解决方案与此相比不好?