Имеет ли 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<< член.

в ответ Джеймс. :)


Я считаю, что это будет адрес объекта ostream, который "" был напечатан в