问题描述
我听说过可变参数函数中的参数提升,例如printf
函数。这什么时候发生?
解决方法
在这样的可变参数函数中:
void f(int,...);
// or
void f(...);
variadic arguments 会进行额外的转换,称为默认参数提升:
-
std::nullptr_t
转换为void*
-
float
参数被转换为double
,就像在浮点提升中一样 -
bool
、char
、short
和无作用域枚举被转换为int
或更广泛的整数类型,如整数提升
请注意,variadic templates 中的参数包不会发生这些转换,因此通常优先于可变参数函数。
template <typename ...Ts>
void f(Ts ...); // no promotions here