函数中的默认参数提升

Default argument promotion in functions

本文关键字:参数 默认 函数      更新时间:2023-10-16

我正在尝试查看函数中的默认参数提升。具体来说,我想测试第6.5.2.2节的函数调用(此处描述)。

我想有一个无原型的函数调用来查看默认参数提升为integer,但我得到了";函数不接受1个参数";错误这就是我要做的:

#include<iostream>
using namespace std;
//void Func(char val);
//void Func(int val);
void Func();  // No prototype
int main(int argc, char** argv)
{
    char charVal = 'a';
    cout << "Func(charVal) - "; Func(charVal);
    return 0;
}
void Func(char val)
{
    cout << "Char arg. Result: " << val << endl;
}
void Func(int val)
{
    cout << "Int arg. Result: " << val << endl;
}

我期望看到Func(int)被调用是因为参数提升。这已经从标准中删除了吗?

干杯。

附言-我刚刚看到这种没有原型的声明是C标准的一部分,而不是C++。C++不支持它的具体原因是什么?

所有函数(通常是命名实体)在使用前都需要声明。当您尝试在main中使用参数调用重载时,您只声明了不带参数的重载(这就是C++中空参数列表的含义)。

您在文件的开头有正确的声明,但由于某种原因,您需要的声明被注释掉了。取消注释,就可以了。

我刚刚看到这种没有原型的声明是C标准的一部分,而不是C++。C++不支持它的具体原因是什么?

因为C++支持重载。重载解析发生在调用函数的编译时,只有当编译器知道候选函数存在时,才能考虑它们——也就是说,如果它们已经被完全声明,以便编译器可以将它们的签名与函数调用的参数类型相匹配。

在C中,编译器知道你指的是哪个函数,无论它是否知道参数类型,因为它是唯一一个具有该名称的函数。这样的声明只是危险的,从参数类型中删除了类型检查,并为各种各样的错误打开了大门。

C++从未支持无原型函数声明。C++中的空参数列表意味着没有参数,而不是缺少原型。

原因是C++具有类型安全链接,如果没有原型,这就不起作用。C++具有类型安全链接,因为这是一个好主意,可以减少错误。(您可以阅读C++的设计与进化以了解更多详细信息。)

C++中的参数提升仅存在于对真正变元函数的调用中,即那些在参数列表中用...声明的函数。