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&&
兼容。
答案 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
是一个好习惯(尤其是在发生类型推导时)。