【问题标题】:how to initialize function arguments that are classes with default value如何初始化作为具有默认值的类的函数参数
【发布时间】:2011-05-13 09:28:47
【问题描述】:

我正在使用 Linux gcc 环境,我需要初始化作为具有默认值的类的函数参数。 当我对类的临时实例执行此操作时,会出现如下错误:“[函数参数]的默认参数具有[类名]类型。 例如:

void foo(std::wstring& str = std::wstring())

错误:“std::wstring& str”的默认参数类型为“std::wstring” 附:使用 VC++ 编译此代码时不会出现任何错误或警告。

如何初始化默认值?

【问题讨论】:

  • 你想达到什么目的?对我来说,你在做什么看起来毫无意义..
  • @Simone - 这可能是一个尝试同时获得默认值和通过引用发送。
  • 绑定到非常量引用不符合标准,但 VC++ 允许它作为 AFAIK 的扩展。

标签: c++ gcc reference default-value


【解决方案1】:

你可以创建一个函数重载:

void foo() {
    std::wstring str;
    foo(str);
}

但我真的没有抓住重点。

编辑: 我的意思是,该函数的目的几乎可以肯定是修改输入字符串。如果您提供了一个以后无法访问的空输入字符串,那何必呢?

【讨论】:

  • 函数的目的也可以是完全不修改输入字符串。引用传递也可以防止复制构造函数被调用。
  • 在很多情况下它可能是有用的,例如这不是一个字符串,而是一个缓冲区,或者一些数据(如详细日志)被方法放在那里但是你只关心结果。尽管如此,您的解决方案还是可以通过标准兼容代码温和地解决问题:)
  • @rursw1 是的,但是 - 在这种情况下 - 如果你不传递 const 引用,我认为函数的接口有些错误。
【解决方案2】:

这应该不会编译。您正在尝试将右值绑定到非常量引用。说std::wstring const & str,它应该可以工作。

【讨论】:

    【解决方案3】:

    您不能将非常量引用绑定到右值。按值传递会起作用:

    void foo(std::wstring str = std::wstring())
    

    或者通过引用到常量:

    void foo(const std::wstring& str = std::wstring())
    

    【讨论】:

    • 我不太明白你的最后一句话。即使编译器没有优化临时和副本,复制一个空字符串到底有多贵?如果暂时省略了,还有什么要移动的?
    • @Charles:如果用户确实提供了一个字符串作为参数怎么办?然后必须在 C++03 中复制。
    • 对不起,我以为您指的是在评论中使用默认参数。在任何情况下,如果用户提供的字符串在很多情况下都是临时的,那么它可以在 C++03 中被省略。副本并不总是必须发生。
    • @Charles:好吧,让我重新表述一下:如果参数是 wstring 类型的左值怎么办? :)
    • 然后将其复制到 C++03 或 C++0x 中。您只能从右值(xvalues 或 prvalues)移动。 [我不太确定这次调查的方向是什么?]
    猜你喜欢
    • 2017-11-19
    • 1970-01-01
    • 2017-12-08
    • 2021-11-27
    • 2015-02-25
    • 2021-10-17
    • 1970-01-01
    • 2021-12-16
    • 1970-01-01
    相关资源
    最近更新 更多