digitalmars.D - Why postblit cannot be disabled when copy ctor is defined
- Fanda Vacek (24/24) Nov 07 2019 import std.stdio;
- Daniel Kozak (3/27) Nov 07 2019 This is a bug, please fill an issue on https://issues.dlang.org/
- Fanda Vacek (4/8) Nov 08 2019 issue created: https://issues.dlang.org/show_bug.cgi?id=20367
- RazvanN (7/31) Nov 08 2019 Once the postblit is defined (even if it is disabled), the copy
import std.stdio; struct A { int x; this(ref return scope A rhs) { writeln("copy ctor: ", x); } disable this(this) {writeln("postblit: ", x); } } void main() { A a; A b = a; // copy constructor gets called } I've got error: Error: struct `tst.A` is not copyable because it is annotated with ` disable` but it should not be used according to https://dlang.org/spec/struct.html#struct-postblit WARNING: The postblit is considered legacy and is not recommended for new code. Code should use copy constructors defined in the previous section. For backward compatibility reasons, a struct that defines both a copy constructor and a postblit will only use the postblit for implicit copying.
Nov 07 2019
On Thu, Nov 7, 2019 at 6:30 PM Fanda Vacek via Digitalmars-d <digitalmars-d puremagic.com> wrote:import std.stdio; struct A { int x; this(ref return scope A rhs) { writeln("copy ctor: ", x); } disable this(this) {writeln("postblit: ", x); } } void main() { A a; A b = a; // copy constructor gets called } I've got error: Error: struct `tst.A` is not copyable because it is annotated with ` disable` but it should not be used according to https://dlang.org/spec/struct.html#struct-postblit WARNING: The postblit is considered legacy and is not recommended for new code. Code should use copy constructors defined in the previous section. For backward compatibility reasons, a struct that defines both a copy constructor and a postblit will only use the postblit for implicit copying.This is a bug, please fill an issue on https://issues.dlang.org/
Nov 07 2019
On Thursday, 7 November 2019 at 19:10:50 UTC, Daniel Kozak wrote:On Thu, Nov 7, 2019 at 6:30 PM Fanda Vacek via Digitalmars-d <digitalmars-d puremagic.com> wrote:issue created: https://issues.dlang.org/show_bug.cgi?id=20367 thanks Fanda[...]This is a bug, please fill an issue on https://issues.dlang.org/
Nov 08 2019
On Thursday, 7 November 2019 at 17:28:44 UTC, Fanda Vacek wrote:import std.stdio; struct A { int x; this(ref return scope A rhs) { writeln("copy ctor: ", x); } disable this(this) {writeln("postblit: ", x); } } void main() { A a; A b = a; // copy constructor gets called } I've got error: Error: struct `tst.A` is not copyable because it is annotated with ` disable` but it should not be used according to https://dlang.org/spec/struct.html#struct-postblit WARNING: The postblit is considered legacy and is not recommended for new code. Code should use copy constructors defined in the previous section. For backward compatibility reasons, a struct that defines both a copy constructor and a postblit will only use the postblit for implicit copying.Once the postblit is defined (even if it is disabled), the copy constructor will be ignored. The solution to this is to simply comment out the postblit. If a library object has a postblit, then your hands are pretty much tied. This, indeed, could be fixed by considering that if you have a disabled postblit and a copy constructor, the copy constructor is preferred.
Nov 08 2019