可以使用初始化程序列表更改const值吗?

时间:2019-05-30 05:56:15

标签: c++ const

我已经初始化了const引用z,并尝试使用初始化列表重新初始化它,我得到的输出是更改后的值。 没有错误,没有警告。

#include <iostream>
using namespace std;
class Point {
    private:
    const int &z=9;

    public:
    Point (int &c):z(c){}

    int get_setz(){
        return z;
    }

};

int main()
{
    int m=3;
    Point p(m);
    cout << p.get_setz();
    return 0;
}

Output :
3

1 个答案:

答案 0 :(得分:5)

  

我已经初始化了const引用z并试图重新初始化

您尝试过,但是没有。当使用构造函数成员初始化列表初始化成员时,将忽略任何默认成员初始化程序。 z从未使用值为9的临时变量。因此,C ++规则仍在发挥作用,您可能没有重新设置引用,甚至从未尝试过这样做。

如果您没有使用z初始化c,那么您将有一个悬而未决的参考和代码,这些代码和代码具有不确定的行为。因为9不是对象,所以它是文字。引用只能绑定到对象,因此您将其绑定到一个临时对象,一旦对象初始化完成,该临时对象将超出范围。