考虑一个代码,其中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 使它看起来像是一种可能的用法,而我宁愿避免与宏相关的所有可读性问题。
答案 0 :(得分:1)
另一种方法是使用member initializer list的copy 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){}
};