https://issues.dlang.org/show_bug.cgi?id=15662
Issue ID: 15662 Summary: Cannot move struct with defined opAssign due to @disabled post-blit Product: D Version: D2 Hardware: x86_64 OS: Windows Status: NEW Severity: normal Priority: P1 Component: dmd Assignee: nob...@puremagic.com Reporter: matt.elk...@gmail.com Given the following definition: [code] import std.algorithm; struct ResourceHandle(T, alias Deleter, T Default = T.init) { // Constructors/Destructor this(T handle) {m_handle = handle;} @disable this(this); ~this() {Deleter(m_handle);} // Operators @disable void opAssign(ref ResourceHandle lvalue); ref ResourceHandle opAssign(ResourceHandle rvalue) {swap(m_handle, rvalue.m_handle); return this;} // Methods @property inout(T) handle() inout {return m_handle;} @property T handle(T handle) {Deleter(m_handle); m_handle = handle; return m_handle;} T release() {T result = m_handle; m_handle = Default; return result;} private: T m_handle = Default; } [/code] The following will generate a compile error, making it awkward to move unique resources: [code] unittest { alias RH = ResourceHandle!(uint, (uint) {}); RH[] handles; handles ~= RH(5); // Compile error: ResourceHandle is not copyable because it is annotated with @disable } [/code] See discussion at https://forum.dlang.org/post/nnjfuqeuprcswsjjf...@forum.dlang.org At first I was uncertain whether this was a bug or by design, but Andrei Alexandrescu confirmed the bug status in the linked discussion. --