Перегруженный оператор << возвращение ostream & - PullRequest
0 голосов
/ 25 октября 2011

У меня был следующий код в примере приложения:

ostream& operator<< (ostream& os, const ReferenceTest& rt)
{
    os << rt.counter;  //In this scenario, rt has a public int called counter
}

Я был удивлен, узнав, что этот код без проблем скомпилирован с использованием GCC 4.6.1. Сбой при использовании Visual Studio 2010 по причине, которую я ожидал, а именно, что я не возвращаю ссылку на ostream. Однако выходные данные для программы при компиляции для двух платформ идентичны (у меня есть тривиальная функция main (), которая записывает результаты теста).

Что соответствует стандартам? Я что-то упускаю здесь очевидное?

-Derek

Ответы [ 2 ]

2 голосов
/ 25 октября 2011

Вы скомпилировали с включенными предупреждениями?Я получаю warning: control reaches end of non-void function с g ++.

Вы, конечно, не хотите, чтобы компилятор останавливался на первой ошибке в вашем коде.Вы хотите, чтобы он поймал как можно больше за один раз.Чтобы сделать это, компилятор должен пропатчить ваш ошибочный код, чтобы он мог нажимать дальше.В этом случае патч очевиден: возвращайте поток, предоставленный в качестве аргумента.

Никогда не доверяйте тем "исправлениям", которые бесплатно предоставляет компилятор.Они совсем не бесплатны.Вместо этого исправьте ваш код.

И всегда компилируйте с включенными предупреждениями.

1 голос
/ 25 октября 2011

Отсутствует что-то кроме оператора возврата?Отсутствие этого - неопределенное поведение (я бы даже ожидал, что это будет ошибка времени компиляции для такого простого случая).Может случиться так, что возвращаемое значение из выражения os << rt.counter окажется в том же месте, где ожидается возвращаемое значение для всего operator<<, что заставит его работать случайно.

...