下面是一个示例代码,其中引用了构造函数自变量的引用成员:
struct A
{
A(std::string name): name_(name){}
std::string name_;
};
struct B
{
B(A a): a_(a)
{
}
A& a_;
};
int main()
{
std::unique_ptr<B> b;
{
A a("a");
b.reset(new B(a));
}
b->a_.name_ = "b";
return 0;
}
a_
仍引用此行b->a_.name_ = "b"
中的现有对象吗?是否与返回对函数本地对象的引用类似?
答案 0 :(得分:2)
a_是否仍引用此行中的现有对象b-> a_.name_ =“ b”?
不。 那是Undefined Behavior。
尤其是B
构造函数
B(A a): a_(a)
{
}
生成悬挂参考。
参数a
的活动仅限于构造函数调用的范围。构造函数结束后,对象a
将被销毁。
因此,您初始化的a_
引用指向一个已损坏的对象。
但是,当您尝试访问它时:
b->a_.name_ = "b";
实际上,您正在调用未定义的行为,因为该对象不再存在(这很糟糕!)。
是否与返回对函数本地对象的引用类似?
如果您返回对一个不再存在的对象的引用并尝试访问它,那么……仍然是未定义的行为:悬空引用。
通过代码的构造,以下更改仍然是错误的:
B(A& a): a_(a)
{
}
请注意,该参数现在已通过引用传递。
实际上,即使您不复制该对象的副本,当您尝试访问它时,引用的A
也将被破坏:
{
A a("a");
b.reset(new B(a));
} // Here a will be destroyed because out of scope (as automatic variable).