首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >参数列表中间的默认参数是什么?

参数列表中间的默认参数是什么?
EN

Stack Overflow用户
提问于 2011-04-12 23:25:09
回答 2查看 17.7K关注 0票数 53

我在我们的代码中看到了一个函数声明,如下所示

代码语言:javascript
复制
void error(char const *msg, bool showKind = true, bool exit);

我首先认为这是一个错误,因为你不能在函数中间有默认参数,但是编译器接受了这个声明。以前有没有人见过这个?我使用的是GCC4.5。这是GCC的分机吗?

奇怪的是,如果我把它放在一个单独的文件中并尝试编译,GCC会拒绝它。我已经仔细检查了所有内容,包括使用的编译器选项。

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2011-04-12 23:37:17

如果在函数的第一个声明中,最后一个参数具有默认值,则该代码可以工作,如下所示:

代码语言:javascript
复制
//declaration
void error(char const *msg, bool showKind, bool exit = false);

然后在相同的作用域中,您可以在后面的声明中为其他参数(从右侧)提供默认值,如下所示:

代码语言:javascript
复制
void error(char const *msg, bool showKind = true, bool exit); //okay

//void error(char const *msg = 0 , bool showKind, bool exit); // error

它可以被称为:

代码语言:javascript
复制
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表示,

对于非模板函数,可以在以后的同一范围内的函数声明中添加默认参数。

来自标准本身的示例:

代码语言:javascript
复制
void f(int, int);
void f(int, int = 7);

第二个声明添加了默认值!

另见§8.3.6/6。

票数 60
EN

Stack Overflow用户

发布于 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在关闭编译器扩展的情况下接受了以下内容:

代码语言:javascript
复制
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");
}
票数 9
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/5637679

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档