【发布时间】:2021-05-13 06:05:45
【问题描述】:
当涉及到可变参数函数时,为什么要提升参数,例如浮点数被提升为 double ext,它们是按什么顺序提升的?
Variadic arguments - cppreference.com
默认转化次数
当调用可变参数函数时,在左值到右值、数组到指针和函数到指针conversions 之后,作为变量参数列表一部分的每个参数都会经历额外的转换,称为 默认参数提升:
- std::nullptr_t 转换为 void*
- float 参数被转换为 double,如 floating-point promotion
- bool、char、short 和 unscoped 枚举转换为 int 或更宽的整数类型,如 integer promotion
【问题讨论】:
-
“为什么” 的大多数答案是 “因为标准是这样说的”...
-
是的,但为什么啊哈哈
-
@Jarod42 不同意。标准不是作为神圣的启示给予我们的,而是作为工程师的协作创建的,并且在那里做出的大多数决定都是可以解释的。
-
我认为问题是:标准有这样的要求的理由是什么。很可能是性能和内存对齐,但这需要更精确的解释或至少链接到解释这一点的论文。
-
我尝试通过 open-std.org/jtc1/sc22/wg14/www/C99RationaleV5.10.pdf 和 jslint.com/chistory.html 进行筛选。唯一值得一提的是
For compatibility with past practice, all argument promotions occur as described in K&R in the absence of a prototype declaration。为什么“过去的做法”会引发争论,历史上更好的人将不得不挖掘。
标签: c++ language-lawyer