Thread overview
Why postblit cannot be disabled when copy ctor is defined
Nov 07, 2019
Fanda Vacek
Nov 07, 2019
Daniel Kozak
Nov 08, 2019
Fanda Vacek
Nov 08, 2019
RazvanN
November 07, 2019
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.
November 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/
November 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.
November 08, 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:
>> [...]
>
> This is a bug, please fill an issue on https://issues.dlang.org/


issue created: https://issues.dlang.org/show_bug.cgi?id=20367

thanks

Fanda