重载采用右值引用的类构造函数

时间:2018-11-17 17:57:37

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

我想做以下事情:

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
}
  • 这是重载构造函数的有效方法吗?
  • 特别是将右值引用作为参数的人吗?

根据评论进行编辑

为了澄清这一点,我是新来迁移语义(也是一名业余程序员)的人,我不确定这是否是处理这种情况的好方法。

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

1 个答案:

答案 0 :(得分:1)

  

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

     

特别是将右值引用作为参数的人吗?

通常重载构造函数是有效的,即使是那些带有右值引用参数的构造函数。

尤其是您的示例格式错误。正如您在注释中指出的那样,该示例无法编译。要解决此问题,必须将一个右值传递给委派给其的构造函数。将右值引用变量转换为右值的正确方法是使用std::move。因此,您必须做的是已经知道的事情:

  

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