对成员的 const 引用是否安全
Are const references to members safe
如果我对另一个成员使用 const 引用,
此引用是否可能失效?
class Class {
public:
const int &x{y};
private:
int y;
};
例如,当我在向量中使用这个 class 的实例时
它在 push_back
之后增加了它的容量。
根据标准,所有迭代器和引用都无效,如果
向量必须增加其容量。引用之后还有效吗?
假设这是对同一实例中另一个成员的引用,您需要覆盖复制构造函数来初始化它。默认复制构造函数将从可能失效的旧实例复制对 'y' 的引用。
为什么需要对成员的引用是另一个问题。
P.S。出于同样的原因,您还需要覆盖赋值运算符。
目前这是不安全的,因为当您复制 Class
的实例时,x
将引用复制对象的 y
,而不是它自己的 y
.你可以通过运行下面的代码看到这个:
int main()
{
Class a{};
std::vector<Class> vec;
vec.push_back(a);
//these lines print the same address
std::cout << &(a.x) << std::endl;
std::cout << &(vec[0].x) << std::endl;
}
您可以通过编写自己的复制构造函数和赋值函数来正确初始化来解决此问题 x
:
Class (const Class& rhs) : x{y}, y{rhs.y} {}
这是安全的,因为x
和y
只会与您的对象一起被销毁。 std::vector
的引用无效意味着对向量元素的引用:
Class c;
std::vector<Class> vec;
vec.push_back(c);
Class& cr = vec[0];
//other operations on vec
std::cout << c.x; //fine, that reference is internal to the class
std::cout << cr.x; //cr could have been invalidated
如果我对另一个成员使用 const 引用, 此引用是否可能失效?
class Class {
public:
const int &x{y};
private:
int y;
};
例如,当我在向量中使用这个 class 的实例时
它在 push_back
之后增加了它的容量。
根据标准,所有迭代器和引用都无效,如果
向量必须增加其容量。引用之后还有效吗?
假设这是对同一实例中另一个成员的引用,您需要覆盖复制构造函数来初始化它。默认复制构造函数将从可能失效的旧实例复制对 'y' 的引用。
为什么需要对成员的引用是另一个问题。
P.S。出于同样的原因,您还需要覆盖赋值运算符。
目前这是不安全的,因为当您复制 Class
的实例时,x
将引用复制对象的 y
,而不是它自己的 y
.你可以通过运行下面的代码看到这个:
int main()
{
Class a{};
std::vector<Class> vec;
vec.push_back(a);
//these lines print the same address
std::cout << &(a.x) << std::endl;
std::cout << &(vec[0].x) << std::endl;
}
您可以通过编写自己的复制构造函数和赋值函数来正确初始化来解决此问题 x
:
Class (const Class& rhs) : x{y}, y{rhs.y} {}
这是安全的,因为x
和y
只会与您的对象一起被销毁。 std::vector
的引用无效意味着对向量元素的引用:
Class c;
std::vector<Class> vec;
vec.push_back(c);
Class& cr = vec[0];
//other operations on vec
std::cout << c.x; //fine, that reference is internal to the class
std::cout << cr.x; //cr could have been invalidated