考虑以下自定义数组类
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
};
显然,在构造函数的初始化列表中,将右值表达式(new-expression)评估为指针的右值而不是引用类型。因此,在MSVC(Microsoft Visual Studio 2012 RC)中,会提示有关从元素*到元素(&)[size]的类型转换的错误。
但是,我认为,如果我可以将右值从指针转换为引用,则应该进行编译。我有没有可能在构造函数的初始化列表中找到它?还是仅仅是与C ++语言的原则冲突?我已经研究过reinterpret_cast,但我发现相关的唯一规则是
“类型为T1的左值表达式可以转换为
另一类型的T2。结果是一个左值或x值,表示
与原始左值相同的对象,但类型不同。”-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) { }
};
正如Mat在他的评论中提到的那样,这里的无参数构造函数是一个非常糟糕的主意,因为不会释放内存。希望拥有有效的代码示例将使您能够进行一些试验并得出相同的结论。
关于c++ - 将左值引用存储到动态分配的数组,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/11374296/