Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

Are const references to members safe

If I use a const reference to another member, is it possible that this reference gets invalidated?

class Class {
public:
    const int &x{y};
private:
    int y;
};

For example when I use instances of this class in a vector which increases its capacity after a push_back. According to the standard all iterators and references are invalidated if a vector has to increase its capacity. Is the reference still valid after that?

like image 408
0ax1 Avatar asked Aug 10 '15 07:08

0ax1


1 Answers

This is currently not safe, as when you copy an instance of Class, x will reference the y of the copied object, not its own y. You can see this by running the following code:

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;
}

You can fix this by writing your own copy constructor and assignment functions to correctly initialize x:

Class (const Class& rhs) : x{y}, y{rhs.y} {}

This is safe, becausex and y will only be destroyed along with your object. Invalidation of references for std::vector means references to the vector elements:

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
like image 134
TartanLlama Avatar answered Oct 20 '22 12:10

TartanLlama