考虑以下自定义数组类
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
明确指出转换适用于 左值表达式 。
好的,我知道你现在可能会想到什么 - 为什么你需要这类自定义数组?为什么不只是复合指针而不是问题参考?嗯......你总是需要不同的方法来选择才能知道最好的不是吗?
答案 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];