形参列表中间的默认实参
Default argument in the middle of parameter list?
我在代码中看到一个函数声明,如下所示
void error(char const *msg, bool showKind = true, bool exit);
我首先认为这是一个错误,因为你不能在函数中间有默认参数,但是编译器接受了这个声明。有人见过这个吗?我使用GCC4.5。这是一个GCC扩展吗?
奇怪的是,如果我把它放在一个单独的文件中并尝试编译,GCC会拒绝它。我已经仔细检查了所有内容,包括所使用的编译器选项。
如果在函数的第一个声明中,最后一个参数具有默认值,则该代码将正常工作,如下所示:
//declaration
void error(char const *msg, bool showKind, bool exit = false);
然后在相同的作用域中,您可以在后面的声明中为其他参数提供默认值(从右侧开始),如:
void error(char const *msg, bool showKind = true, bool exit); //okay
//void error(char const *msg = 0 , bool showKind, bool exit); // error
可以调用为:
error("some error messsage");
error("some error messsage", false);
error("some error messsage", false, true);
在线演示:http://ideone.com/aFpUn
注意,如果您为第一个参数(从左开始)提供默认值,而不为第二个参数提供默认值,它将无法编译(如预期的那样):http://ideone.com/5hj46
§8.3.6/4说,
对于非模板函数,默认为参数可以稍后添加类中的函数声明范围。
来自标准本身的例子:
void f(int, int);
void f(int, int = 7);
第二个声明添加默认值!
答案可能在8.3.6:
8.3.6默认参数6类的成员函数除外模板中的默认参数成员函数定义出现在课堂之外定义添加到集合中类提供的默认参数类中的成员函数声明类定义。默认参数类的成员函数模板上应注明成员的初始声明类模板内的函数。
的例子:
class C { void f(int i = 3); void g(int i, int j = 99); }; void C::f(int i = 3) // error: default argument already { } // specified in class scope void C::g(int i = 88, int j) // in this translation unit, { } // C::g can be called with no argument
看完这篇文章后,我发现MSVC10在关闭编译器扩展的情况下接受了以下内容:
void error(char const* msg, bool showKind, bool exit = false);
void error(char const* msg, bool showKind = false, bool exit)
{
msg;
showKind;
exit;
}
int main()
{
error("hello");
}
相关文章:
- 非类型引用形参/实参
- c++——关于使用默认实参的困惑
- 调用对象作为默认实参的this
- c++中的默认实参有一些特殊的属性
- 如何传递操作符作为默认函函数实参
- 带默认模板实参的形参包
- 默认模板实参可以对应于特化吗?
- 如何在c++函数模板中指定默认的非模板实参初始化式
- 在c++中真的不可能跳过带有默认实参的模板形参吗?为什么语法不这么认为?
- 为int实参创建一个带有默认情况的转换用例.但是默认情况下无法正确处理字符
- c++默认实参值使用另一个形参的值
- 将vector传递给函数时,默认实参(如果有的话)应该是什么?
- 模板默认实参SFINAE对clang有歧义,但对g++很好
- 继承带有默认实参的构造函数
- 通过引用访问默认实参是否安全
- c++模板声明中的作用域和默认实参:澄清标准
- c++中的函数重载与默认实参
- 指定默认实参的友元声明必须是定义
- 模板形参重新定义默认实参
- 形参列表中间的默认实参