构造函数参数的引用成员按值传递

时间:2019-04-02 19:18:34

标签: c++ c++11

下面是一个示例代码,其中引用了构造函数自变量的引用成员:

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"中的现有对象吗?是否与返回对函数本地对象的引用类似?

1 个答案:

答案 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).