digitalmars.D.bugs - [Issue 15662] New: Cannot move struct with defined opAssign due to
- via Digitalmars-d-bugs (52/52) Feb 08 2016 https://issues.dlang.org/show_bug.cgi?id=15662
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: nobody puremagic.com Reporter: matt.elkins 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/nnjfuqeuprcswsjjfmkl 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. --
Feb 08 2016