2016-02-26 51 views
0

我有這樣的代碼:C++ 11右值引用與與指針與「正常」的成員引用

class A{ 
}; 

class B{ 
    B(A &&a) : a(std::move(a)){}; 
    A a; 
} 

A a{}; 
B b{ std::move(a) }; 
// a is unusable 

我用右值,因爲我不希望對象是複製版。

我想改變class B使用引用的:

class A{ 
}; 

class B{ 
    B(A &a) : a(a){}; 
    A &a; 
} 

A a{}; 
B b{ a }; 
// a is usable 

會不會有這樣的任何負面影響,除了活時的顧慮?我不重新分配a object,所以我不需要指針。但我應該考慮它們嗎?

+1

在你的第一個例子中,對象被複制了。你需要'B(A && a):a(std :: move(a)){}'。 – aschepler

+0

當然。我將編輯 – Nick

+1

可能不是問題,但現在'B'外部的代碼可以有效地修改'B'的狀態(通過修改':: a')。這原本是不可能的。現在必須爲'B :: a'的值在任何時候改變的可能性做好準備。 –

回答

1

爲什麼不讓調用者決定是移動還是複製其A對象?

class A {}; 

class B { 
public: 
    B(A a_param) : a(std::move(a_param)) {} 
private: 
    A a; 
}; 

void f1() { 
    A a; 
    B b{a}; // Makes a copy, a is still usable. 
} 

void f2() { 
    A a; 
    B b{std::move(a)}; // Does a move, a is not usable. 
} 

void f3() { 
    B b{A{}}; // Does a move of the temporary object. 
} 
+0

我刪除了複製構造函數,對象是不可複製的。但是無論如何物體是巨大的。問題是如果我轉向引用成員,我應該期待什麼? – Nick