可变参数函数中的参数提升是什么?

问题描述

我听说过可变参数函数中的参数提升,例如printf 函数。这什么时候发生?

解决方法

在这样的可变参数函数中:

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

variadic arguments 会进行额外的转换,称为默认参数提升:

  • std::nullptr_t 转换为 void*

  • float 参数被转换为 double,就像在浮点提升中一样

  • boolcharshort 和无作用域枚举被转换为 int 或更广泛的整数类型,如整数提升

请注意,variadic templates 中的参数包不会发生这些转换,因此通常优先于可变参数函数。

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