Подтвердить что ты не робот

Что делает оператор << в пространстве имен std?

Конечно, работает следующий код (он вызывает std:: cout:: operator < <):

cout << 1 << '1' << "1" << endl;

Случилось найти также std:: operator < < < <, и кажется, что он работает только для аргументов char или char *:

operator<<(cout, '1'); // ok
operator<<(cout, "1"); // ok
operator<<(cout, 1);   // error

Итак, зачем нам этот оператор и как его использовать?

Спасибо.

4b9b3361

Ответ 1

operator<<(cout, '1'); // ok
operator<<(cout, "1"); // ok
operator<<(cout, 1);   // error

Первые два работают, потому что они вызывают функции нечлена, принимающие два аргумента. Функции, которые принимают char и char const* в качестве аргумента, определяются как нечленные (свободные) функции.

Однако функция, которая принимает int как аргумент, определяется как функция-член, а это значит, что третье нужно вызвать функцию-член. Если вы вызываете его как функцию, отличную от члена, тогда int необходимо преобразовать в некоторый тип, для которого существует функция, не являющаяся членом. Поэтому, когда это преобразование считается, это приводит к двусмысленности, потому что существует много возможных преобразований одинаково хорошо.

Как сказано, это должно работать:

cout.operator<<(1); //should work

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

Ответ 2

Я всегда понимал причину, по которой char, unsigned char и char* определяются как функции нечлена вне класса basic_ostream, поэтому легче перегрузить их.

Смотрите, все остальные operator<< используют char как строительные блоки. Поэтому, если вы хотите создать ostream, специализированный для определенного типа символа charT и/или traits типа признаков, вам нужно будет специализировать эти функции operator<<.

Если бы они были функциями-членами, вам пришлось бы специализировать весь класс (в основном воссоздавая все функции-члены класса).

Я не уверен, что единственная причина, но то, что я всегда видел.