在 C 语言中,当调用的函数没有原型时,编译器会执行默认参数提升。
但是C++呢?默认参数提升何时发生?
在 C++11 标准 5.2.2/7 中:
当给定参数没有参数时,参数的传递方式使得接收函数可以通过调用 va_arg (18.10) 获取参数的值。[注意:本段不适用于传递给函数参数包的参数。函数参数包在模板实例化(14.5.3)期间扩展,因此每个这样的参数在实际调用函数模板特化时都有一个对应的参数。—end note ] 对参数表达式执行左值到右值 (4.1)、数组到指针 (4.2) 和函数到指针 (4.3) 标准转换。具有(可能是 cv 限定的)类型 std::nullptr_t 的参数被转换为类型 void* (4.10)。在这些转换之后,如果参数没有算术、枚举、指针、指向成员的指针,或类类型,程序格式错误。传递具有非平凡复制构造函数、非平凡移动构造函数或非平凡析构函数的类类型(第 9 条)的潜在评估参数,没有相应的参数,由实现定义的语义有条件地支持。如果参数具有受整数提升 (4.5) 约束的整数或枚举类型,或受浮点提升 (4.6) 约束的浮点类型,则在调用之前将参数的值转换为提升的类型. 这些提升称为默认参数提升。没有对应的参数,有条件地支持实现定义的语义。如果参数具有受整数提升 (4.5) 约束的整数或枚举类型,或受浮点提升 (4.6) 约束的浮点类型,则在调用之前将参数的值转换为提升的类型. 这些提升称为默认参数提升。没有对应的参数,有条件地支持实现定义的语义。如果参数具有受整数提升 (4.5) 约束的整数或枚举类型,或受浮点提升 (4.6) 约束的浮点类型,则在调用之前将参数的值转换为提升的类型. 这些提升称为默认参数提升。
本段仍然没有指定默认参数提升何时发生。这一段可能讲的太多,没有清晰的逻辑。我努力概述逻辑但失败了。我不熟悉调用 va_arg。
希望你能帮助我。