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

Overload a class constructor that takes an rvalue reference

我想做如下事情:

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
}

根据评论编辑

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

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

Is this a valid way to overload a constructor in general?

And specifically one that takes an rvalue reference as a parameter?

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

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

The only option I can see is to std::move(a).