2014-10-09 54 views
3

考慮移動賦值運算符的this規範形式:c + +只移動物體 - 如何從賦值運算符返回

class_name & class_name :: operator= (class_name &&) 

當副本被禁用鏈接等於是不可能的,因爲返回的值是lvalue並從邏輯點的觀點它沒有任何意義。在那裏我可以看到的唯一的地方(也許你有其他的樣品)使用返回值調用,它接受一個函數時reference/const referenceclass_name

void foo(class_name&){} 
void bar(const class_name&){} 

void use_foo_bar() 
{ 
    some_class a; 

    foo(a = get_some_class()); 
    bar(a = get_some_class()); 
} 

,但我認爲這是一個不好的編程風格(個人意見)我不想在代碼庫中看到它。

當禁用複製或void返回類型正常時,返回當前對象是否有意義?

+0

如果你寫'的std ::鏈內move'這是可能的。 – 2014-10-09 14:46:27

+0

@LightnessRacesinOrbit這就是...調用函數;)我不直接使用該值,我使用它調用函數並使用該函數的返回 – Felics 2014-10-09 14:49:56

+1

我真的沒有看到問題。 – 2014-10-09 14:59:32

回答

2

你可能會認爲鏈接永遠不是好東西,總是給operator=一個void返回類型。

但是,如果你不這樣做,請讓自己的精神開銷「這是一種移動型?」在編寫operator=簽名時,對所有類型執行相同的操作。

編輯:換句話說,以通常的方式編寫運算符的工作量要少於編碼讀者的工作量,以便找出原因。

1

複製被禁用時返回當前對象是否有意義或 void返回類型是否正常?

關於operator=應該在任何情況下是否返回指定的對象或只是void的問題存在一般性爭論。許多人說,允許鏈接導致可讀性較差的代碼,並鼓勵在一條語句/行中寫入不止一個東西。

我假設你的問題不那麼哲學,但更實際的定位。在這種情況下,考慮到某些鏈仍然工作:

auto&& c = a = b; 

c是基準(用class_name&型),而不是一個對象,所以從operator=返回的左值參考適當地初始化c。這顯然也是對那些引用函數參數的情況下,有相當多的人:

template <typename T> 
void f(T&& t); 

// […] 

f(a = b);