函数中的默认参数提升
Default argument promotion in functions
我正在尝试查看函数中的默认参数提升。具体来说,我想测试第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++中的参数提升仅存在于对真正变元函数的调用中,即那些在参数列表中用...
声明的函数。
- 使函数参数默认为周围范围
- 如何将值传递给其参数(默认参数)
- 当“std::make_index_sequence”和“std::index_sequence”用于模板参数默认类型时
- C ,构造器中允许的参考参数默认值
- 哪些规则控制参数默认赋值?
- 错误:上一个规范后给出的参数默认参数
- 是否可以设计一个包含模板参数默认值的类
- 构造函数中参数C++默认值
- 如何设置依赖于其他参数的参数默认值
- C++模板参数默认函数实现
- QInput对话框参数默认值
- g++4.8.2上列表方法参数默认初始化时出错
- 在函数定义中指定参数默认值会导致错误 C2143:语法错误:'='之前缺少')'
- 函数模板:将第一个模板参数默认为第二个
- 模板模板参数默认可以引用其他模板类型的参数
- 参数默认为先例参数的值
- 如何修改一个类,使它只有一个成员函数,所有参数默认
- 内置类型的模板参数默认值
- 是否可以使用构造函数或对象作为其他类方法的参数默认值?
- 模板参数默认为更高版本