2015-07-01 5 views
2

Все гиды о operator<< говорят, что вы должны вернуть выходной поток:Возвращение результата `<<` от оператора `` <<

ostream & operator<<(ostream &os, const Foo &x) { os<<"foo"; return os; } 

Но не это может быть просто немного проще?

ostream & operator<<(ostream &os, const Foo &x) { return os<<"foo"; } 

Если вызываемая << следует направляющие и возвращает первый параметр, то он должен быть 100% то же самое. Но я полагаюсь на то, что не гарантируется? Неужели это может произойти в некоторых случаях?

Зачем мне это нужно? Не только, чтобы спасти нажатия клавиш (мы не в codegolf.SE) Фактическое использование немного сложнее:

enum class Foo { A, B, C }; 
ostream & operator<<(ostream &os, const Foo &x) { 
    switch (x) { 
     case A: return os << "A"; 
     case B: return os << "B"; 
     case C: return os << "C"; 
    } 
    return os << "Bad Foo (" << (int)x << ")"; 
} 

многократного возвращения сделать код более простым и читаемым (представьте себе 50 случаев, а не 3) по сравнению ко всем альтернативам, которые я нашел. Обратите внимание, что отсутствие default позволяет компилятору предупреждать о недостающих случаях, поэтому вы не забудете добавить его при добавлении значения перечисления.

+0

На самом деле, у вас нет вопросов (сделайте это так) –

+1

Хм, подумал, что его спросили о гарантиях и быстрее, хотя в середине –

+0

@ DieterLücking возникает вопрос: «Я полагаюсь на то, что не гарантируется ? Может ли это сбой в каком-то случае? »Возможно, вы потеряли его, потому что я добавил текст ниже, объясняющий мотивацию для запроса. – ugoren

ответ

1

Так как ожидается, будет в состоянии цепи, ваше упрощение должно работать, и потерпит неудачу при компиляции, если определение класса нарушитель не следует Конвенцию

Любое место, где

std::cout << a << b << std::endl; 

будет работать, так будет ваше упрощение, которого должно хватить без истинного guarentee.

Уточните, что operator << для строковых литералов, как и в вашем вопросе, должен возвращать правильные ostream

+0

Зная, что он работает, когда цепочки работают достаточно хорошо для меня. Спасибо. – ugoren

4

Предполагая перегрузки вы используете возвращается ссылка, эти

ostream & operator<<(ostream &os, const Foo &x) { os<<"foo"; return os; } 
ostream & operator<<(ostream &os, const Foo &x) { return os<<"foo"; } 

будет иметь тот же эффект и позволяют обычное сцепление

Если первое предложение было не занимать (например, вызов какой-либо другой настраиваемой перегрузки, которая не возвращает ссылку на объект потока), тогда вам придется либо явно вернуть ссылку на поток, либо предоставить другую перегрузку, если вы все еще хотите связать эти утверждения.