Имеет ли std::cout возвращаемое значение?
Мне любопытно, имеет ли std:: cout возвращаемое значение, потому что когда я это делаю:
cout << cout << "";
напечатан некоторый код hexa. Что означает это печатное значение?
3 ответов
потому что операнды cout << cout являются определяемыми пользователем типами, выражение фактически является вызовом функции. Компилятор должен найти лучшее operator<< что соответствует операндам, которые в этом случае оба типа std::ostream.
есть много перегрузок оператора-кандидата, из которых можно выбрать, но я просто опишу тот, который в конечном итоге выбирается, следуя обычному процессу разрешения перегрузки.
std::ostream есть оператор преобразования, который позволяет преобразование в void*. Это используется для проверки состояния потока как логического условия (т. е. позволяет if (cout) для работы).
выражение правого операнда cout неявно преобразован в void const* используя этот оператор преобразования, то operator<< перегрузка, которая принимает ostream& и void const* вызывается для записи этого значения указателя.
обратите внимание, что фактическое значение в результате ostream to void* преобразование не указано. Этот спецификация только предписывает, что если поток находится в плохом состоянии, возвращается нулевой указатель, иначе возвращается ненулевой указатель.
на operator<< перегрузки для вставки потока имеют возвращаемое значение: они возвращают поток, который был предоставлен как операнд. Это то, что позволяет связывать операции вставки (и для входных потоков, операции извлечения с использованием >>).
cout не имеет возвращаемого значения. cout является объектом типа ostream. operator << имеет возвращаемое значение, оно возвращает ссылку на cout.
см.http://www.cplusplus.com/reference/iostream/ostream/operator%3C%3C/ Для справки.
единственная подпись, которая соответствует:
структурами данных ostream& operator
таким образом, он возвращает указатель на operator<< член.
в ответ Джеймс. :)