Вопросы о `std::cout << &std::hex << 123 << std::endl;`

Вот фрагмент кода:

#include <iostream>

int main()
{
    std::cout << std::hex << 123 << std::endl;

    std::cout << &std::hex << 123 << std::endl;
}
  1. Что такое &std::hex? Я думаю, что он получает адрес std::hex. И адрес будет распечатан.

  2. Есть ли потенциальная проблема с этим фрагментом кода из-за кто-то сказал, что плохо получать адрес функции, предоставляемой стандартной библиотекой?

У меня возникает вопрос, почему или что могло бы побудить вас использовать &std::hex вместо просто std::hex, как обычно используется в этом контексте?

lurker 10.04.2022 03:34

Одна из причин, по которой вопросы ограничены одним вопросом, состоит в том, чтобы упростить отслеживание вопросов и ответов. В этом случае ваш первый вопрос является дубликатом Почему определения указателей на функции работают с любым количеством амперсандов '&' или звездочек '*'?, а второй — дубликатом вопрос, на который вы ссылались в сочетании с список назначенных адресных функций, который содержит std::hex.

JaMiT 10.04.2022 03:59
Формы c голосовым вводом в React с помощью Speechly
Формы c голосовым вводом в React с помощью Speechly
Пытались ли вы когда-нибудь заполнить веб-форму в области электронной коммерции, которая требует много кликов и выбора? Вас попросят заполнить дату,...
Стилизация и валидация html-формы без использования JavaScript (только HTML/CSS)
Стилизация и валидация html-формы без использования JavaScript (только HTML/CSS)
Будучи разработчиком веб-приложений, легко впасть в заблуждение, считая, что приложение без JavaScript не имеет права на жизнь. Нам становится удобно...
Flatpickr: простой модуль календаря для вашего приложения на React
Flatpickr: простой модуль календаря для вашего приложения на React
Если вы ищете пакет для быстрой интеграции календаря с выбором даты в ваше приложения, то библиотека Flatpickr отлично справится с этой задачей....
В чем разница между Promise и Observable?
В чем разница между Promise и Observable?
Разберитесь в этом вопросе, и вы значительно повысите уровень своей компетенции.
Что такое cURL в PHP? Встроенные функции и пример GET запроса
Что такое cURL в PHP? Встроенные функции и пример GET запроса
Клиент для URL-адресов, cURL, позволяет взаимодействовать с множеством различных серверов по множеству различных протоколов с синтаксисом URL.
Четыре эффективных способа центрирования блочных элементов в CSS
Четыре эффективных способа центрирования блочных элементов в CSS
У каждого из нас бывали случаи, когда нам нужно отцентрировать блочный элемент, но мы не знаем, как это сделать. Даже если мы реализуем какой-то...
2
2
66
1
Перейти к ответу Данный вопрос помечен как решенный

Ответы 1

Ответ принят как подходящий

Имя функции распадается на указатель на эту функцию. Итак, std::cout << std::hex использует средство вставки потока, которое принимает указатель на функцию, которая принимает std::ios_base& и возвращает std::ios_base&. Средство вставки потока просто вызывает функцию.

У указателей на функции есть еще одно специфическое свойство: когда вы пишете &std::hex, оно возвращает адрес функции. То же самое для &&std::hex, &&&&std::hex и т. д. Все они означают одно и то же.

$ это опечатка? Я даже не думаю, что &&std::hex допустим C++. Так что я не уверен, что вы имеете в виду.

Wyck 10.04.2022 03:16

Тогда как насчет второго вопроса?

John 10.04.2022 03:38

@John, в этом случае std::hex и другие манипуляторы ввода-вывода обозначаются как адресуемые функции, поэтому использование их адреса разрешено. См. раздел "Ограничение адресации" @en.cppreference.com/w/cpp/language/extending_std

Remy Lebeau 10.04.2022 04:34

@ Пит Беккер &&std::hex не компилировать! godbolt.org/z/shPhdsfx1

John 10.04.2022 06:13

Я думаю, вы перепутали это с *****std::hex с неявным преобразованием функции в указатель перед каждым косвенным указателем. && в clang/gcc анализируется как специальный оператор «адрес метки», и даже & &std::hex не работает, потому что пытается взять адрес указателя функции rvalue &std::hex

Artyer 10.04.2022 10:05

Другие вопросы по теме