首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >什么时候会发生默认的论点晋升?

什么时候会发生默认的论点晋升?
EN

Stack Overflow用户
提问于 2013-06-28 05:38:29
回答 2查看 922关注 0票数 1

在C语言中,当调用的函数没有原型时,编译器执行默认参数提升

但是C++呢?什么时候会发生默认的论点晋升?

在C++11标准5.2.2/7中:

当给定参数没有参数时,参数的传递方式使接收函数能够通过调用va_arg (18.10)获得参数的值。注意:本段不适用于传递给函数参数包的参数。函数参数包在模板实例化期间进行扩展(14.5.3),因此当实际调用函数模板专门化时,每个这样的参数都有相应的参数。-end注意到从lvalue到rvalue (4.1)、数组到指针(4.2)和函数到指针(4.3)的标准转换是在参数表达式上执行的。具有(可能是cv限定的)类型std::nullptr_t的参数被转换为void* (4.10)类型。这些转换之后,如果参数没有算术、枚举、指针、指向成员的指针或类类型,则程序的格式不正确。传递具有非平凡复制构造函数、非平凡移动构造函数或非平凡析构函数且没有相应参数的类类型的潜在评估参数(第9条),有条件地支持实现定义语义。如果参数具有受积分提升(4.5)约束的整数或枚举类型,或受浮点提升(4.6)约束的浮点类型,则在调用之前将参数的值转换为提升类型。这些晋升称为默认参数升级。

这一段仍然没有具体说明什么时候会发生默认的参数提升。这一段可能说得太多,没有明确的逻辑。我努力勾勒出逻辑,但失败了。我不熟悉调用 va_arg

希望你能帮我。

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2013-06-28 05:53:29

默认升级将发生在调用函数之前,在调用上下文中。

如果你真的在询问默认促销是在什么情况下进行的,那么摘录中就包含了这一点,尽管这是一个很小的部分,很容易被忽略:“当给定的论点没有参数时……”。换句话说,它在本质上与C中的情况是相同的,除了不指定参数类型的C样式函数声明在C++中不存在。因此,在不指定参数类型的情况下,只有当函数具有显式省略(如printfint printf(char const *format, ...); )时,才能使用参数。

票数 1
EN

Stack Overflow用户

发布于 2013-06-28 05:56:06

从您在问题中引用的段落中可以看出:“参数的值在调用”之前被转换为提升类型。

您说C“当被调用的函数没有原型时,默认参数提升”--但请记住,C++中不存在场景--您不能调用一个没有看到任何声明或定义的函数。

提到“调用va_arg”意味着在调用函数时应用了一些参数提升,该函数随后将使用va_arg函数访问这些值(参见arg)。可以这样想:一个函数调用可能传递值int(3),另一个int(7777),还有另一个char(7) --被调用的函数如何知道所期望的是什么?它可能会将该参数的所有值提升到某种最大支持的整数类型,例如intlong,然后当va_arg在函数中使用时,它将从intlong转换为va_arg调用指定的任何整数类型。例如,这确实意味着可能传递int(7777)值,其中只有一个char是预期的,并且该值可能在没有警告的情况下被截断为8位,但这通常比程序崩溃更好,因为传递的数据字节数与消耗的数据数不匹配,或者其他一些奇怪的副作用。

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/17357898

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档