Что такое продвижение параметров в переменных функциях?

#c #variadic-functions

#c #variadic-функции

Вопрос:

Я слышал о продвижении параметров в переменных функциях, например, в printf функции. Когда это происходит?

Ответ №1:

В переменных функциях, подобных этому:

 void f(int, ...);
// or
void f(...);
 

переменные аргументы подвергаются дополнительным преобразованиям, известным как повышение аргументов по умолчанию:

  • std::nullptr_t преобразуется в void*
  • float аргументы преобразуются в double , как при продвижении с плавающей запятой
  • bool char Перечисления , , short , и unscoped преобразуются в int целочисленные типы или более широкие, как в целочисленном продвижении

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

 template <typename ...Ts>
void f(Ts ...);             // no promotions here
 

Комментарии:

1. std::nullptr_t что это?

2. @FabioDiLieto Если вы просто нажмете на ссылку, которой я поделился, а затем нажмете nullptr_t , вы увидите, что это тип литерала нулевого указателя, nullptr .