完美转发构造函数和删除构造函数

Perfect forwarding constructor and deleted constructors

正如 by Michael Park 所指出的,如果我们不想在错误的构造函数中结束,添加完美的转发构造函数可能会很棘手。

目前我有一个 class A 它使用了一个完美的转发构造函数,因此,我需要显式声明 4 个构造函数:A&const A&, A&&const A&&:

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

我想禁止使用 const 引用右值构造函数,所以我正在考虑删除它:

class A
{
public:
    template<typename T> A(T&&);
    A(A&);
    A(const A&);
    A(A&&);
    A(const A&&) = delete;
};

看起来像it works so far。但我只是在看一个实际的样本,我想要一个更好的确认,例如来自 C++ 标准。

难不成完美转发构造函数会接管删除的构造函数?毕竟,通用参考 T&&const A&&.

兼容

完美转发构造函数通常更适合非常量左值

Is it possible that the perfect forwarding constructor will take over the deleted constructor?

没有。 A(const A&&) 是一个完美匹配,它被显式删除,因此,如果我们尝试从 const 左值引用构造一个 A,则会出现编译时错误。

然而你可能会做这样的事情 template<typename T, typename = typename std::enable_if<!std::is_same_v<A&&, T>> A(T&&); 还有。

P.S。将构造函数标记为 explicit 是一个好习惯(尤其是在发生类型推导时)。