ดูเหมือนว่าวิธีเดียว (สำหรับ C ++ 17 และก่อนหน้า) ในการบังคับstd::vector
ใช้ use move semantics ในการจัดสรรใหม่คือการลบตัวสร้างการคัดลอก :) ด้วยวิธีนี้มันจะใช้ตัวสร้างการเคลื่อนไหวของคุณหรือพยายามตายในเวลารวบรวม :)
มีกฎระเบียบจำนวนมากที่มีstd::vector
ไม่ต้องใช้คอนสตรัคย้ายจัดสรร แต่ไม่มีอะไรเกี่ยวกับการที่มันต้องใช้มัน
template<class T>
class move_only : public T{
public:
move_only(){}
move_only(const move_only&) = delete;
move_only(move_only&&) noexcept {};
~move_only() noexcept {};
using T::T;
};
มีชีวิต
หรือ
template<class T>
struct move_only{
T value;
template<class Arg, class ...Args, typename = std::enable_if_t<
!std::is_same_v<move_only<T>&&, Arg >
&& !std::is_same_v<const move_only<T>&, Arg >
>>
move_only(Arg&& arg, Args&&... args)
:value(std::forward<Arg>(arg), std::forward<Args>(args)...)
{}
move_only(){}
move_only(const move_only&) = delete;
move_only(move_only&& other) noexcept : value(std::move(other.value)) {};
~move_only() noexcept {};
};
รหัสสด
T
ชั้นเรียนของคุณต้องมีตัวnoexcept
ดำเนินการสร้าง / ตัวดำเนินการย้ายและตัวnoexcept
ทำลาย มิฉะนั้นคุณจะได้รับข้อผิดพลาดในการคอมไพล์
std::vector<move_only<MyClass>> vec;