我想要实现这一点:
- second parameter by default set to first argument类似于:
int foo (int a, int b = a);但如何做到这一点呢?
非常感谢!
发布于 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示例
替代正在重载:
int foo(int a, int b);
int foo(int a)
{
return foo(a,a);
}发布于 2012-10-12 04:39:06
这不被允许的原因已经被解决了,但是另一个类似@Vyktor的解决方案是使用boost::optional而不是幻数(与创建重载相比,这有利弊):
int foo(int a, boost::optional<int> b = boost::none)
{
if(!b) b = a;
}发布于 2012-10-12 04:00:42
我推荐将重载作为Luchian Grigore suggested用于这个特定的任务,但通常的做法是保留一些值来说明“这是默认的”。例如
int foo( int a, int b = -1)
{
if( b == -1){
b = a;
}
}使用object (而不是标量值)可以很好地实现这一点(通过创建新的交付类来表示默认值),但是使用int必须这样做。
请注意,您必须100%确定b不能获得值-1 (或您的保留值是什么)。
https://stackoverflow.com/questions/12847456
复制相似问题