class同居的c++复制(引用)构造函数和移动构造函数
c++ copy (reference) constructor and move constructor of class cohabitation
此处显示意图的代码:
template<typename T>
class B
{
public:
// this should indeed set t_ as a reference to t
B(T& t):t_(t){}
// this should instead set t_ as a copy of t
B(T&& t):t_(t){}
T& t_; // maybe type should be something else ?
};
A a;
B b1(a); // fine
B b2(A()); // problem
可以吗?
我假设您希望 b1
和 b2
具有相同的类型,B<A>
。
如果是这样,您可以ab使用std::shared_ptr
:
std::shared_ptr<T> ptr;
B(T &src) : ptr(std::shared_ptr<T>(), &src) {}
B(T &&src) : ptr(std::make_shared<T>(srd::move(src))) {}
如果你不喜欢这个解决方案,你可以这样做:
std::optional<T> storage;
T &ref;
B(T &src) : ref(src) {}
B(T &&src) : storage(std::move(src)), ref(*storage) {}
请注意,在这种情况下,您需要自定义 copy/move 构造函数,否则您的 class 将不符合 the rule of three.
您也可以在这里使用 std::unique_ptr
代替 std::optional
。
在 C++17 中,使用 Class Template Argument Deduction (CTAD),你可以这样做:
template<typename T>
class B
{
public:
B(T&& t):t_(t){}
T t_;
};
template <typename T> B(T&) -> B<T&>;
template <typename T> B(T&&) -> B<T>;
此处显示意图的代码:
template<typename T>
class B
{
public:
// this should indeed set t_ as a reference to t
B(T& t):t_(t){}
// this should instead set t_ as a copy of t
B(T&& t):t_(t){}
T& t_; // maybe type should be something else ?
};
A a;
B b1(a); // fine
B b2(A()); // problem
可以吗?
我假设您希望 b1
和 b2
具有相同的类型,B<A>
。
如果是这样,您可以ab使用std::shared_ptr
:
std::shared_ptr<T> ptr;
B(T &src) : ptr(std::shared_ptr<T>(), &src) {}
B(T &&src) : ptr(std::make_shared<T>(srd::move(src))) {}
如果你不喜欢这个解决方案,你可以这样做:
std::optional<T> storage;
T &ref;
B(T &src) : ref(src) {}
B(T &&src) : storage(std::move(src)), ref(*storage) {}
请注意,在这种情况下,您需要自定义 copy/move 构造函数,否则您的 class 将不符合 the rule of three.
您也可以在这里使用 std::unique_ptr
代替 std::optional
。
在 C++17 中,使用 Class Template Argument Deduction (CTAD),你可以这样做:
template<typename T>
class B
{
public:
B(T&& t):t_(t){}
T t_;
};
template <typename T> B(T&) -> B<T&>;
template <typename T> B(T&&) -> B<T>;