const引用是否安全

时间:2015-08-10 07:34:02

标签: c++ reference member getter invalidation

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

/*if( $wp->query_vars["post_type"] == 'my_items' ){
        if(file_exists(TEMPLATEPATH . '/my_items/archive-my_items.php')) {
            return locate_template('my_items/archive-my_items.php');
        } else {
            return $plugindir . '/template/my_items.php';
        }

        if(file_exists(TEMPLATEPATH . '/my_items/my_items.php')) {
            return locate_template('my_items/my_items.php');
        } else {
            return $plugindir . '/template/my_items.php';
        }
    }*/

例如,当我在向量中使用此类的实例时 在class Class { public: const int &x{y}; private: int y; }; 之后增加其容量。 根据标准,所有迭代器和引用都是无效的 向量必须增加其容量。之后参考仍然有效吗?

2 个答案:

答案 0 :(得分: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;
}

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

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

这是安全的,因为xy只会与您的对象一起销毁。 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

答案 1 :(得分:3)

假设这是对同一实例中另一个成员的引用,则需要覆盖复制构造函数以对其进行初始化。默认复制构造函数会将引用复制到&#39; y&#39;来自可能无效的旧实例。

为什么需要对成员的引用是另一个问题。

P.S。您也需要覆盖赋值运算符,原因相同。