完善的转发构造函数和已删除的构造函数

时间:2019-08-13 13:42:42

标签: c++ c++11 constructor perfect-forwarding forwarding-reference

by Michael Park指出,如果我们不想以错误的构造函数结尾,那么添加完美的转发构造函数可能会很棘手。

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

const A&&

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

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

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

完美的转发构造函数是否有可能接管已删除的构造函数?毕竟,通用引用class A { public: template<typename T> A(T&&); A(A&); A(const A&); A(A&&); A(const A&&) = delete; }; T&&兼容。

1 个答案:

答案 0 :(得分:4)

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

  

完美的转发构造函数是否有可能接管   删除的构造函数?

不。 A(const A&&)是完美匹配,并且已被明确删除,因此,如果我们尝试从const左值引用构造A,则会产生编译时错误。

但是您可以做这样的事情 template<typename T, typename = typename std::enable_if<!std::is_same_v<A&&, T>> A(T&&);

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