构造函数使用可变数量的右值引用

Constructor consuming a variable number of rvalue references

我希望创建一个对象 A,它可以通过复制或移动可变数量的对象 B 来构造。像这样:

    class B {}
    
    class A {
        A(B&& operand1, B&& operand2, ... B&& operandk) {
           // move construct A
        }
        
        A(B& operand1, B& operand2, ... B& operandk) {
           // copy construct B
        }
    }

我似乎无法找到一种方法来在任何类型的可迭代容器中存储 r 值引用来完成此操作。我读过 std::reference_wrapper 但它似乎不允许 r 值。有没有办法完成这样的事情,或者我根本不应该尝试这样做的原因是什么?非常感谢。

当您需要拥有一个对象时,只需按值获取即可。调用者可以移动构造或复制构造参数,具体取决于他们是否需要保留要提供给构造函数的对象的副本。

而且 - 甚至更好 - 这样他们可以移动构造 一些 对象而不是其他对象。

在构造函数中,您可以使用初始化列表中的 B 对象自由移动构造您的 A 子对象,因为您知道调用者已经复制了任何需要复制的内容。

要接受可变数量的参数,只需让您的构造函数成为一个接受参数包的模板,并且参数按值:

class A {
public:
    template <typename... T>
    A(T ...);
};

在实现中,你可以在从每个参数移动构造一个 B 之后做任何你需要做的事情。如果参数不能全部用于创建 B:

,这将导致构造函数模板无法实例化
template <typename... T>
A::A(T ... args) {
    (... , do_something_with_a_B(B{std::move(args)}));
}