C ++ 11 — Почему потоковые манипуляторы C ++ не имеют оператора вызова?

Мне было интересно: если, например, std::endl является обычной функцией, то почему ей не хватает оператора вызова ( operator())?

я знаю, что он предназначен для использования со вставкой (<<) и извлечение (>>) операторы. Я пытался назвать это так:

std::endl.();

Но, конечно, это не сработало.

1

Решение

std::endl это просто обычная функция (или, скорее, шаблон функции), которую вы можете вызвать. Вы просто должны вызвать его с правильным аргументом:

std::endl(std::cout);    // OK, equivalent to "std::cout << std::endl;"

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

ostream & operator<<(ostream & os, ostream & (*f)(ostream &))
{
return f(os);
}

(На самом деле это будет шаблон для basic_ostream иметь дело с любыми чертами характера и распределителями.)

7

Другие решения

Других решений пока нет …

По вопросам рекламы [email protected]