Why postblit cannot be disabled when copy ctor is defined

RazvanN razvan.nitu1305 at gmail.com
Fri Nov 8 11:05:40 UTC 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.

More information about the Digitalmars-d mailing list