2014-01-26 2 views
-1

Зачем возвращаться по ссылке для цепочки операторов?Возврат по ссылке и цепочке операторов

Я смотрел так много ответов на SO, а фраза «возврат по ссылке, чтобы разрешить цепочку операторов», но без объяснения я не понимаю, почему я не могу сделать это по-другому.

Например, это, кажется, компилируется на моей системе и работает отлично, а сцепление работает:

TestClass operator+=(TestClass tc){ 
    somePrivateValue += tc.somePrivateValue; 
    return *this; 
} 

Где я могу также сделать это:

TestClass& operator+=(TestClass& tc){ 
    somePrivateValue += tc.somePrivateValue; 
    return *this; 
} 

Исключая тот факт, второй пример не требует, чтобы конструктор копирования вызывался для TestClass, каковы другие преимущества?

+0

Первый компилируется, но действительно ли он делает то, что вы хотите? – user2079303

ответ

2

и цепочки работ

Нет, это не так.

TestClass a = some_value; 
TestClass b = some_other_value; 
(a += b) += b; 

Теперь проверьте значение a, однако это сделано. Отражает ли это увеличение на b в два раза? Или только один раз?

+0

Совершенно верно. Я смотрел только на случай 'a + = b + = c', а не на квадратный скобок, как у вас, выше которого изменяется порядок оценки. Теперь прояснилось :) спасибо. –

Смежные вопросы