定义了一个以成员作为引用类型的类:
struct NodeBase{
int& val;
NodeBase(int input = 0) :val{ input }{}
};
然后创建了这个类类型的两个对象:
int value1 = 1, value2 = 2;
NodeBase first(value1);
NodeBase second(value2);
创建first
后,其成员val
等于1.但是,在创建second
后,val
中first
的值更改为2不知道为什么会这样。
答案 0 :(得分:2)
引用绑定到函数参数input
,当构造函数完成时,该参数超出范围。这使引用悬空。
将参考作为参数,而不是让引用引用外部对象。
NodeBase(int& input) :val{ input }{}
如果您不希望该类引用外部变量,请在不带引用的情况下使该成员成为普通int
。假设您尝试使用对于非const引用案例没有意义的默认参数,这可能是您应该做的。
答案 1 :(得分:0)
您还需要通过引用传递输入:
struct NodeBase{
int& val;
NodeBase(int& input) :val{ input }{}
};
如果你没有,val
将引用本地参数,一旦构造函数完成,它就不再存在。所以它是未定义的行为。
请注意,您无法提供默认参数=0
,这在保留参考时没有意义。
答案 2 :(得分:0)
您将value1
作为存储在input
中的副本传递。然后保存对input
变量的引用。不是value1
。因此,当构造函数终止时,您将引用die。并成为一个悬垂的参考。
试试这个:
struct NodeBase{
int& val;
NodeBase(int& input) :val{ input }{}
};