const引用是否安全

0ax*_*ax1 5 c++ getter reference member invalidation

如果我对另一个成员使用const引用,该引用是否可能失效?

class Class {
public:
    const int &x{y};
private:
    int y;
};
Run Code Online (Sandbox Code Playgroud)

例如,当我在一个向量中使用此类的实例时,它会在a之后增加其容量push_back.根据标准,如果向量必须增加其容量,则所有迭代器和引用都将失效.之后参考仍然有效吗?

Tar*_*ama 7

这当前是不安全的,因为当您复制一个实例时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;
}
Run Code Online (Sandbox Code Playgroud)

您可以通过编写自己的复制构造函数和赋值函数来正确初始化来解决此问题x:

Class (const Class& rhs) : x{y}, y{rhs.y} {}
Run Code Online (Sandbox Code Playgroud)

这是安全的,因为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
Run Code Online (Sandbox Code Playgroud)