我在我们的代码中看到了一个函数声明,如下所示
void error(char const *msg, bool showKind = true, bool exit);我首先认为这是一个错误,因为你不能在函数中间有默认参数,但是编译器接受了这个声明。以前有没有人见过这个?我使用的是GCC4.5。这是GCC的分机吗?
奇怪的是,如果我把它放在一个单独的文件中并尝试编译,GCC会拒绝它。我已经仔细检查了所有内容,包括使用的编译器选项。
发布于 2011-04-12 23:37:17
如果在函数的第一个声明中,最后一个参数具有默认值,则该代码可以工作,如下所示:
//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/6。
发布于 2011-04-12 23:50:26
答案可能在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:默认参数已经{} //在类作用域void C::g(int i= 88,int j) //在这个翻译单元中,可以不带参数地调用{} // C::g
读完这篇文章后,我发现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");
}https://stackoverflow.com/questions/5637679
复制相似问题