Имеет ли 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<<
член.
в ответ Джеймс. :)