std::cout
- это объект, а не функция, поэтому правила, запрещающие получение адреса большинства стандартных функций, не применяются.
std::addressof()
требуется только там, где оператор адреса может быть перегружен (как правило, это плохая вещь, которую даже следует учитывать), и поэтому используется в шаблонах, чтобы избежать сюрпризов. В нем нет необходимости ни для каких стандартных типов, а значит, и для объектов. 1008 *
Чтобы расширить стандартные функции, большинство функций в стандартной библиотеке не обозначены как «адресуемые».
Таким образом, выбор их адреса может привести к неожиданностям, от «случайной работы» до предоставления указатель на функцию с неожиданной сигнатурой (больше аргументов, неожиданное соглашение о вызовах, что угодно), чтобы вообще не компилироваться. И это может измениться с любым изменением в цепочке инструментов.