Задать вопрос
DanielDemidko
@DanielDemidko
Программист

Каким образом operator>> попадает в глобальное прогстранство имён?

Если я не импортирую пространство имён std, а указываю нужные мне типы и функции явно, через префикс std::, то каким образом std::operator>> и std::operator<< оказываются в глобальном пространстве имён?
Поясню примером кода
#include <iostream>
int main()
{
    int size;
    // Как? Ведь std::operator>> определён в std, а мы его не импортировали
    std::cin >> size;
}

И для сравнения
namespace My
{
    std::istream &operator>>(std::istream &stream, int &n) { /*...*/}
}
int main()
{
    int size;
    // Как мы видим operator>> из My не влияет пока мы
    //явно его не импортируем в глобальное пространство имён
    std::cin >> size;
}

Что за магия с std ?
  • Вопрос задан
  • 110 просмотров
Подписаться 1 Простой Комментировать
Решения вопроса 1
@MarkusD Куратор тега C++
все время мелю чепуху :)
Тебе стоит ознакомиться с понятием ADL.

Because of argument-dependent lookup, non-member functions and non-member operators defined in the same namespace as a class are considered part of the public interface of that class (if they are found through ADL)

Т.е. любая внешняя перегрузка оператора для некоторого типа, определенная в пространстве имен этого типа, является частью интерфейса этого типа и доступна через ADL.

Также через ADL доступны и дружественные функции, определенные по месту объявления дружественности и не имеющие предшествующего объявления.

В итоге, operator>> никакими магическими силами не переносится в глобальное пространство имен. Он просто находится по ADL, т.к. правильно реализован и является частью интерфейса соответствующего типа.
Ответ написан
Комментировать
Пригласить эксперта
Ответы на вопрос 1
maaGames
@maaGames
Погроммирую программы
// Как? Ведь std::operator>> определён в std, а мы его не импортировали
std::cin >> size;

Он определён не в std, а в виде inline метода класса basic_istream (файл istream):

basic_istream& __CLR_OR_THIS_CALL operator>>(int& _Val);

Получается, сперва ищется внешняя функция, если не нашлось, то используется метод класса.
Ответ написан
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Похожие вопросы