Move Constructor Syntax

ryuukk_ ryuukk.dev at gmail.com
Sun Oct 6 16:05:01 UTC 2024


On Sunday, 6 October 2024 at 04:04:28 UTC, Walter Bright wrote:
> ```
> struct S { ... }
>
> this(ref S) // copy constructor
> this(this)  // postblit
> this(S)     // move constructor
> ~this()     // destructor
>
> alias T = S;
> this(T);    // also move constructor
>
> alias Q = int;
> this(Q);    // regular constructor
> ```
> As the above illustrates, a move constructor cannot be 
> distinguished from a regular constructor by syntax alone. It 
> needs semantic analysis.
>
> While this seems simple enough, it isn't I have discovered to 
> my chagrin. The overload rules in the language (including 
> things like rvalue references where sometimes an rvalue becomes 
> an lvalue) that the move constructors get confused with the 
> copy constructors, leading to recursive semantic loops and 
> other problems.
>
> I've struggled with this for days now.
>
> A fix that would simplify the language and the compiler would 
> be to have a unique syntax for a move constructor, instead of 
> the ambiguous one in the proposal. That way, searching for a 
> copy constructor will only yield copy constructors, and 
> searching for a move constructor will only yield move 
> constructors. There will be a sharp distinction between them, 
> even in the source code. (I have seen code so dense with 
> templates it is hard to figure out what kind of constructor it 
> is.)
>
> Something like one of:
> ```
> 1. =this(S)
> 2. this(=S)
> 3. <-this(S)
> ```
> ?
>
> It may take a bit of getting used to. I kinda prefer (1) as it 
> is sorta like `~this()`.

1. Do you think people will read `=this` as `move this` = is move?
2. =S, that's `worry` emoji, look it up
3. for a feature that appeal to C++ programmers, if they ever 
decide to try D, they'll get confused with `->`



```
@move this(S)
```



More information about the Digitalmars-d mailing list