完美转发构造函数和删除构造函数
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
是一个好习惯(尤其是在发生类型推导时)。
正如 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
是一个好习惯(尤其是在发生类型推导时)。