首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >C++默认函数参数

C++默认函数参数
EN

Stack Overflow用户
提问于 2012-10-12 03:55:10
回答 4查看 5.8K关注 0票数 6

我想要实现这一点:

代码语言:javascript
复制
- second parameter by default set to first argument

类似于:

代码语言:javascript
复制
int foo (int a, int b = a);

但如何做到这一点呢?

非常感谢!

EN

回答 4

Stack Overflow用户

回答已采纳

发布于 2012-10-12 03:56:34

这在以下方面是被禁止的:

8.3.6默认参数dcl.fct.default

9)每次调用函数时都会计算默认参数。未指定函数参数的求值顺序。因此,函数的参数不应在默认参数表达式中使用,即使未对其求值也是如此。在默认参数表达式之前声明的函数的参数属于作用域,并且可以隐藏命名空间和类成员名称。示例:

int a;

int f(int a , int b = a); / / error: parameter a

/ / used as default argument

typedef int I;

int g( float I , int b = I (2)); / / error: parameter I found

int h(int a , int b = sizeof (a )); / / error, parameter a used

/ / in default argument

-end示例

替代正在重载:

代码语言:javascript
复制
int foo(int a, int b);

int foo(int a)
{
   return foo(a,a);
}
票数 18
EN

Stack Overflow用户

发布于 2012-10-12 04:39:06

这不被允许的原因已经被解决了,但是另一个类似@Vyktor的解决方案是使用boost::optional而不是幻数(与创建重载相比,这有利弊):

代码语言:javascript
复制
int foo(int a, boost::optional<int> b = boost::none)
{
    if(!b) b = a;
}
票数 3
EN

Stack Overflow用户

发布于 2012-10-12 04:00:42

我推荐将重载作为Luchian Grigore suggested用于这个特定的任务,但通常的做法是保留一些值来说明“这是默认的”。例如

代码语言:javascript
复制
int foo( int a, int b = -1)
{
    if( b == -1){
       b = a;
    }
}

使用object (而不是标量值)可以很好地实现这一点(通过创建新的交付类来表示默认值),但是使用int必须这样做。

请注意,您必须100%确定b不能获得值-1 (或您的保留值是什么)。

票数 2
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/12847456

复制
相关文章

相似问题

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