避免将左值引用绑定到数据容器和包装器的临时引用的设计 我正在努力设计几个(可能两个)C++类,它们一起工作并实现数据容器(vector)和数据包装器(整数)的分类,这些数据包封装单个向量元素(或者更好地说是访问它)。 该向量只包含int的向量。 整数/包装器提供对int的访问(可能不持有它)
要求:避免将左值引用绑定到数据容器和包装器的临时引用的设计 我正在努力设计几个(可能两个)C++类,它们一起工作并实现数据容器(vector)和数据包装器(整数)的分类,这些数据包封装单个向量元素(或者更好地说是访问它)。 该向量只包含int的向量。 整数/包装器提供对int的访问(可能不持有它),c++,C++,要求: 包装器/整数必须作为左值可用 数据容器应将数据保存为int的向量(而不是整数的向量) 包装器还保存一些其他数据成员(不可能重新解释castint->Integer) 我在设计这个(见下文)时没有遇到左值引用无法绑定到临时引用的问题。我理解这是不可能的,我理解代码是错误的(以及为什么它是错误的)。没有必要解释左值引用不能绑定到右值。我正在努力找到一个解决方案,以满足上述要求,而不是这个问题 如何在C++中进行设计?(可以是任何现代标准) #包括 类整数 { 内部和参考; bool其他数据成
int
的向量(而不是整数的向量)int
->Integer)#包括
类整数
{
内部和参考;
bool其他数据成员;
公众:
整数(int&rhs):ref_t(rhs){}
整数和运算符=(int i)
{
ref_t=i;
归还*这个;
}
};
类向量
{
std::矢量数据;
公众:
向量():数据(10){}
整数和运算符[](整数i)
{
返回整数(数据[i]);//注意:这不起作用
}
};
无效写入1(整数和i)
{
i=1;
}
int main()
{
向量v;
写一个(v[5]);
}
按值返回“临时”不会复制,甚至不会移动(从C++17开始保证,但在以前的版本中通常作为一致性优化实现)。您必须这样做,因为您的操作符[]
需要为任何索引形成一个新的包装器。(无论Integer
的其他成员如何,reinterpret\u cast
方法都具有未定义的行为)由于生存期延长,通用代码可以将自动&&
绑定到代理对象,并且可以分配给它,因此通常不需要知道代理(这是可取的)
另外,如果要避免将参数复制到不知道代理类型的函数(如
write_one
),可以接受const Integer&
。要实现这一点,请使您的运算符=
常量(这听起来很奇怪,直到您记住要修改的不是整数。您可能不希望整数
保留对整数的引用。对于POD类型,您不会获得任何效率提升,只会带来麻烦。@sweenish我认为Integer
必须保留该引用,因为数据不属于该类。它属于Vector
类-Integer
仅提供对它的访问。您正在尝试返回对函数local temporary的引用。这绝不是一个好主意。由于您的整数
已经包含引用,只需按值返回它。您可以将其更改为:整数运算符[](int i)
?@Johnnymop,这是一个有趣的想法。然后需要一个额外的副本,我需要看看Integer的其他数据成员会发生什么。。但这肯定是一个值得尝试的想法!
#include<vector>
class Integer
{
int& ref_t;
bool other_data_member;
public:
Integer(int& rhs): ref_t(rhs) {}
Integer& operator=( int i )
{
ref_t = i;
return *this;
}
};
class Vector
{
std::vector<int> data;
public:
Vector(): data(10) {}
Integer& operator[](int i)
{
return Integer( data[i] ); // caution: this doesn't work
}
};
void write_one( Integer& i )
{
i = 1;
}
int main()
{
Vector v;
write_one( v[5] );
}