这不是您问题的直接答案,因为我无法提供替代品std::vector
,或者提供不同的使用方式来让您做您需要做的事情。
但是,如果可以修改 的定义MyObject
,则可以选择更改它,以便它使用std::reference_wrapper
而不是常规引用。这将允许MyObject
分配。
例子:
#include <vector>
#include <functional>
#include <iostream>
struct MyObject
{
//int &_i;
std::reference_wrapper<int> _i;
MyObject(int &i):_i(i) {}
};
int main() {
std::vector<MyObject> vec;
int i1 = 3;
int i2 = 4;
MyObject c1(i1);
MyObject c2(i2);
/* Storing object. */
vec.push_back(c1);
/* Assigning to it. */
vec[0] = c2;
/* Confirming that it's the correct object now. */
for (const MyObject &it : vec)
std::cout << it._i << std::endl;
/* Modifying the value of its internal reference. */
vec[0]._i.get() = 5;
/* Confirming that the original int changed value indeed. */
std::cout << "i2 == " << i2 << std::endl;
return 0;
}
警告:现有代码可能已经包含对引用成员的直接分配(即_i
上面代码中调用的成员)。这些分配旨在更改引用所指对象的值。当用 a 替换引用时std::reference_wrapper
,所有直接赋值_i = x
必须用 替换_i.get() = x
,否则程序的语义会完全改变。
(编辑)如果使用的引用是 const-references const T&
,std::reference_wrapper<const T>
可以使用 a 。使用上面的示例,MyObject
then 的定义更改为:
struct MyObject
{
std::reference_wrapper<const int> _i;
MyObject(const int &i):_i(i) {}
};