制作复制的成员引用变量是指副本的成员而不是原始成员

时间:2015-10-07 06:06:13

标签: c++ c++11 initialization

考虑一个代码,其中struct具有成员变量bar和引用bar的成员引用变量。例如:

struct Foo{
    double bar;
    double &bar_ref=bar;
};

void receivesFoo(Foo cp_foo){
    //&cp_foo.bar_ref is the same as &my_foo.bar_ref
 }

int main(){
    Foo my_foo;
    receivesFoo(my_foo);
    return 0;
}

问题在于,如果您复制Foo,例如,将其传递给某个函数,cp_foo.bar_ref将引用my_foo.bar而不是cp_foo.bar }。如何让它改为引用cp_foo.bar

注意:我使用这些引用变量来命名方便,因为有些tutorials 使它看起来像是一种可能的用法,而我宁愿避免与宏相关的所有可读性问题。

1 个答案:

答案 0 :(得分:1)

另一种方法是使用member initializer listcopy constructor

struct Foo{
    double bar;
    double &bar_ref;
    Foo():bar_ref(bar){}
    Foo(const Foo& a):bar_ref(bar){}
};

这似乎有效,但增加了必须维护两个具有类似代码的单独初始化列表的不便。如果您被允许使用C ++ 11,您可以通过以下方式避免它:

struct Foo{
    double bar;
    double &bar_ref=bar;
    Foo(){}
    Foo(const Foo& a){}
};

请注意,如果使用指针

,可能会遇到类似的问题

正如@juanchopanza评论,您还可以使用default关键字改进上一个示例。有关详细信息,请参阅this question

struct Foo{
    double bar;
    double &bar_ref=bar;
    Foo()=default;
    Foo(const Foo& a){}
};