考虑以下类的自定义数组
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
这清楚地表明转换适用于左值表达式。
好的,我知道你现在可能会怎么想 - 为什么你需要这样的自定义数组类,你为什么不只是复合指针而不是有问题的引用?嗯...在知道最好的方法之前,您总是需要选择不同的方法,不是吗?