【发布时间】:2018-01-12 00:58:22
【问题描述】:
我一直在搞乱容器类中包装的引用。为什么下面的代码是合法的并且看起来表现正确?
#include <iostream>
class Foo
{
public:
Foo( int i ) : i_( i ) {}
int i_;
};
class FooWrapper
{
public:
FooWrapper( Foo& foo ) : foo_( foo ) {}
Foo& foo_;
};
int main( int argc, char* argv[] )
{
Foo foo( 42 );
FooWrapper fw( foo );
FooWrapper fw2 = fw;
std::cout << fw2.foo_.i_ << std::endl;
return 0;
}
在没有明确的operator= 的情况下,我相信 C++ 会进行成员复制。所以当我做FooWrapper fw2 = fw;时,这不是两个操作:(1)使用默认ctor创建FooWrapper fw,然后(2)从fw分配到fw2?我确定这不会发生,因为无法在未初始化的情况下创建引用,所以 fw2 的创建实际上是否被视为复制构造?
我有时不清楚副本构建与分配的角色;它们有时似乎会相互渗透,就像在这个例子中一样,但可能有一些我不知道的规则。我将不胜感激。
【问题讨论】:
标签: c++ reference variable-assignment copy-constructor assignment-operator