函数中的默认参数提升

Default argument promotion in functions

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

我想要一个无原型函数调用来查看默认参数提升为整数,但我收到“函数不接受 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) 由于参数提升而被调用。 这已经从标准中删除了吗?

干杯。

P.S- 我刚刚看到这种无原型声明是 C 标准的一部分,而不是 C++。 C++ 不支持它的任何特定原因?

所有函数(以及一般的命名实体)都需要在使用前声明。当您尝试使用 main.

中的参数调用它时,您只声明了没有参数的重载(这是 C++ 中空参数列表的含义)

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

I just saw that this kind of prototype-less declarations are part of C standard, NOT C++. Any particular reason why C++ doesn't support it?

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

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

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

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

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