【问题标题】:referenced argument to a function with default value in C++ [duplicate]C++中具有默认值的函数的引用参数[重复]
【发布时间】:2011-01-06 20:09:53
【问题描述】:

可能重复:
Default value to a parameter while passing by reference in C++

是否可以这样做:

// definition
bool MyFun(int nMyInt, char* szMyChar, double& nMyReferencedDouble = 0.0);

然后函数可以这样调用:

MyFun(nMyInt, szMyChar, nMyReferencedDouble);

或者像这样:

MyFun(nMyInt, szMyChar);

我的编译器(VS 98)抱怨。有没有办法做到这一点?

【问题讨论】:

标签: c++ visual-c++ arguments


【解决方案1】:

你可以重载这个函数。

// Definition
bool MyFun(int nMyInt, char* szMyChar, double& nMyReferencedDouble);

// Overload
bool MyFun(int nMyInt, char* szMyChar)
{
    double nMyReferencedDouble = 0.0;
    MyFun( nMyInt, szMyChar, nMyReferencedDouble );
}

这是您绕过当前 C# 中没有默认值的限制的方法,并且同样适用于 C++ 中的语义限制。

【讨论】:

  • +1:漂亮干净。我正要建议这件事。
【解决方案2】:

由于您只能将临时对象绑定到 const 引用并且常量表达式默认参数转换为临时对象,因此您只能使用 const 引用的参数来执行此操作。

但是,您可以重载该函数并让不带引用的函数创建一个本地命名对象,并将其传递给带有额外引用参数的重载。

实际上,我所说的并不完全正确。默认参数就像参数的初始化器,所以如果你有一个合适的非常量双精度可用,你可以将它绑定到引用参数。

例如

extern double dflt;
bool MyFun(int nMyInt, char* szMyChar, double& nMyReferencedDouble = dflt);

【讨论】:

  • 不能在代码中修改非const dflt值,改变MyFun的含义吗?
  • @Arc:是的,但大概采用非const 引用的目的是修改传递的参数;它可能是一个“out”唯一的参数。很难想到这样的情况会合法使用但语言允许。
  • 当然,尽管在 C++ 中,它是“ref”还是“out”在语法上并不清楚。如果它确实是一个仅输出参数,那么你的解决方案在语义上是正确的,因为在代码中更改 dflt 不会改变任何东西。
【解决方案3】:

不,不是。基本上,参考是应该存在的东西。在您的情况下,如果您没有为 fun() 传递变量,那么 nMyReferencedDouble 将不会引用任何东西。

【讨论】:

    【解决方案4】:

    这是不允许的,因为你有一个非常量引用。如果你有一个 const 引用是可能的

    bool MyFun(int nMyInt, char* szMyChar, const double& nMyReferencedDouble = 0.0)
    

    但我认为这不是您需要的。

    【讨论】:

      猜你喜欢
      • 2016-09-05
      • 2011-05-06
      • 1970-01-01
      • 2013-02-14
      • 2014-02-10
      • 2011-01-27
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多