【问题标题】:Overload a class constructor that takes an rvalue reference重载一个接受右值引用的类构造函数
【发布时间】:2018-11-17 17:57:36
【问题描述】:

我想做如下的事情:

class Foo
{
    Foo(int &&a, int b, std::string s="");
    // does not compile because a is not an rvalue:
    // Foo(int &&a, std::string s) : Foo(a, 0, s) {}
    Foo(int &&a, std::string s) : Foo(std::move(a), 0, s) {} // move a
}
  • 一般来说,这是重载构造函数的有效方法吗?
  • 特别是一个将右值引用作为参数的?

基于 cmets 编辑

澄清一下,我是移动语义的新手(也是一名业余程序员),我只是不确定这是否是处理这种情况的好方法。

我根据评论(现已删除)添加了第一个问题,该评论表明这不是重载构造函数的正确方法。

【问题讨论】:

  • 你为什么不想使用std::move? “更好”是什么意思?
  • 如果编译成功,默认参数会使调用哪个构造函数不明确。
  • 您已经认识到std::move 是正确的做法。
  • 感谢您的 cmets。我已经相应地编辑了这个问题。 @Ripi2 我会看看是什么。

标签: c++ move-semantics rvalue-reference constructor-overloading stdmove


【解决方案1】:

一般来说,这是重载构造函数的有效方法吗?

特别是一个将右值引用作为参数的?

一般来说,重载构造函数是有效的,即使是具有右值引用参数的构造函数。

特别是,您的示例格式不正确。正如您在 cmets 中指出的那样,该示例无法编译。要修复它,您必须将一个右值传递给您委托给的构造函数。将右值引用变量转换为右值的正确方法是使用std::move。所以,你必须做的是你已经知道的:

我能看到的唯一选项是std::move(a)

【讨论】:

  • 致未来的读者:我在看到这个答案之前编辑了这个问题。谢谢,这回答了我的第二个问题,我可以推断我的第一个问题的答案是肯定的。
猜你喜欢
  • 2020-09-20
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2012-07-19
  • 1970-01-01
  • 1970-01-01
  • 2012-05-09
相关资源
最近更新 更多