我一直在搞包裝在容器類中的引用。爲什麼下面的代碼合法,看起來行爲正確?C++引用可以賦值嗎?
#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)創建FooWrapper fw
與默認ctor後跟(2)分配從fw
到fw2
?我相信這不會發生,因爲不能創建未初始化的引用,所以實際上將fw2
的創建視爲複製構造?
我有時不清楚副本構建與分配的角色;他們似乎有時會流血,就像在這個例子中一樣,但可能有一些我不知道的規則。我會很感激一個解釋。
是的,這就是我的意思。改變了措辭'隱含定義拷貝constructor' –
措詞還涉及到這樣的事實,時下一個可以顯式地請求編譯器通過'default'關鍵字生成一個複製構造: 'CLASS_NAME(常量CLASS_NAME&)=默認值;' –