0

考虑以下类的自定义数组

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)中提示关于从element *element (&)[size]的类型转换的错误。

但是,我认为如果我可以将右值从指针转换为引用,它应该可以编译。有没有机会在构造函数的初始化列表中实现它?或者这一切都与 C++ 语言的原则相冲突?我已经调查了reinterpret_cast,但我发现唯一相关的规则是

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

这清楚地表明转换适用于左值表达式

好的,我知道你现在可能会怎么想 - 为什么你需要这样的自定义数组类,你为什么不只是复合指针而不是有问题的引用?嗯...在知道最好的方法之前,您总是需要选择不同的方法,不是吗?

4

2 回答 2

2

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 在他的评论中提到的,这里的无参数构造函数是一个非常糟糕的主意,因为内存不会被释放。希望拥有一个有效的代码示例可以让您进行一些实验并得出相同的结论。

于 2012-07-07T11:02:49.870 回答
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];
于 2012-07-07T11:15:51.753 回答