- показать тип возвращаемого значения:
std::ostream &
Типы возвращаемых данных обычных функций не являются частью их подписи или искалеченного имени. Нет способа получить тип возвращаемого значения из искаженного имени. Для этого вам нужно найти файл заголовка, который объявляет функцию.
Это отличается для шаблонов функций.
показать std::ostream
вместо std::__1::basic_ostream<char, std::__1::char_traits<char> >&
. Сразу после std::
есть __
, который я не получаю, и шаблонный ввод. ostream
реализован как шаблон?
Стандарт определяет, что std::ostream
является псевдонимом типа для std::basic_ostream<char, std::char_traits<char>>
, который является специализацией шаблона шаблона std::basic_ostream
. Есть специализации этого для каждого символьного типа, который поток может использовать, например, std::basic_ostream<wchar_t, std::char_traits<wchar_t>>
(псевдоним std::wostream
) для широких символьных потоков.
Псевдонимы типов разрешаются во время компиляции к фактическому имени типа, к которому они относятся to, поэтому искаженное имя не содержит никакой информации о псевдониме, который использовался в объявлении. Также было бы бессмысленно проводить различие, поскольку функция должна быть одинаковой, независимо от того, какой псевдоним использовался, поэтому имя символа не может отличаться от него.
В принципе, вы можете запустить поиск и -замена для стандартных псевдонимов стандартной библиотеки. Я не знаю ни одного инструмента, который делает это на макушке. В любом случае вы быстро привыкните к псевдонимам.
::__1
- это встроенное пространство имен, используемое стандартной библиотекой, чтобы иметь возможность прозрачно определять несколько версий символов стандартной библиотеки. Имена во встроенном пространстве имен можно искать так, как если бы они были объявлены во вложенном пространстве имен, поэтому при использовании, например, std::ostream
, библиотека может фактически объявить ostream
не в пространстве имен std
, а в std::__1
, который все равно будет найден, если __1
является встроенным пространством имен.
Это деталь реализации, которую вы должны просто проигнорировать. Двойное подчеркивание в имени является хорошим показателем того, что вам не нужно заботиться о деталях реализации, поскольку идентификаторы с двойным подчеркиванием зарезервированы для использования языковой реализацией.
Опять же, вы возможно, можно искать и заменять такие встроенные пространства имен из стандартного пространства имен библиотеки, но я не знаю, делает ли это какой-либо инструмент, и опять же, к нему быстро привыкают.