On Tuesday, 1 October 2024 at 06:39:21 UTC, Walter Bright wrote:
>Manu suggested an intrinsic, something like:
__rvalue(s)
where __rvalue is a keyword.
Nice!
October 01 Re: Move Constructors - Converting Lvalues to Rvalues | ||||
|---|---|---|---|---|
| ||||
Posted in reply to Walter Bright | On Tuesday, 1 October 2024 at 06:39:21 UTC, Walter Bright wrote: >Manu suggested an intrinsic, something like:
where __rvalue is a keyword. Nice! | |||
October 01 Re: Move Constructors - Converting Lvalues to Rvalues | ||||
|---|---|---|---|---|
| ||||
Posted in reply to Walter Bright | On Monday, 30 September 2024 at 16:05:16 UTC, Walter Bright wrote: >I've been implementing move constructors. They are working, at least on my test cases so far. They are distinguished by a copy constructor takes its argument by ref, and a move constructor by value:
Is it necessary to breed entities? Doesn't std.algorithm.move do everything we need?
| |||
October 02 Re: Move Constructors - Converting Lvalues to Rvalues | ||||
|---|---|---|---|---|
| ||||
Posted in reply to Richard (Rikki) Andrew Cattermole | Now to get annoying again:
What is the difference between move assignment @move + reference counting, and move constructors?
```d
void caller() {
T thing = ...; // rc: 1
call1(thing);
call2(thing);
// ?reachable thing
thing.opRCSub(); // elided due to having been moved
thing.__dtor; // elided due to reachable type state
}
void call1(T thing) {
thing.opRCAdd(); // elided due to pair
thing.opRCSub(); // elided due to pair
thing.__dtor;
}
void call2(@move T thing) {
thing.opRCAdd(); // elided due to @move
thing.opRCSub();
thing.__dtor;
}
```
| |||
October 01 Re: Move Constructors - Converting Lvalues to Rvalues | ||||
|---|---|---|---|---|
| ||||
Posted in reply to Dukc | On 10/1/2024 12:27 AM, Dukc wrote:
> Why special syntax? `move` is a DRuntime function so it's expected that it can have special semantics, even without special syntax.
Converting to an rvalue is an enabler of other functions, too, not just move. __rvalue is a building block, not a complete function.
| |||
October 01 Re: Move Constructors - Converting Lvalues to Rvalues | ||||
|---|---|---|---|---|
| ||||
Posted in reply to Richard (Rikki) Andrew Cattermole | On 10/1/2024 1:59 AM, Richard (Rikki) Andrew Cattermole wrote:
> Why do you need to?
A move constructor just has to initialize the object. A move assignment has to destroy the target first, then move.
They are fundamentally different.
| |||
October 01 Re: Move Constructors - Converting Lvalues to Rvalues | ||||
|---|---|---|---|---|
| ||||
Posted in reply to Dukc | On 10/1/2024 12:25 AM, Dukc wrote:
> You can make it to work with a compiler instrinsic. The intrinsic would either be an UDA applied to `move` that allows the compiler to make those assumptions, or an intrinsic function that works along the lines of `nove` and `moveEmplace`. The public DRuntime functions would forward or alias to the instrinsic function.
move() is an unhappy maze of templates. We need something a lot simpler.
| |||
October 01 Re: Move Constructors - Converting Lvalues to Rvalues | ||||
|---|---|---|---|---|
| ||||
Posted in reply to Per Nordlöw | On 10/1/24 06:55, Per Nordlöw wrote:
> On Monday, 30 September 2024 at 19:37:04 UTC, Timon Gehr wrote:
>> Otherwise, maybe expose explicit moves. This is useful generally. Can just be `move(x)`, where `move` is either special, or is a function with a "move by default" attribute on its parameter, as we discussed previously.
>
> Considering the template-complexity of the current implementation of `core.lifetime.move` it will beneficial compile-time wise to make `move` become a builtin. Ideally I would like to have a special syntax for converting an l-value to an r-value.
I think in case we did go the function route, I think any implementation of `move` that is much more complex than the following is a failure:
```d
auto move(T)(@moved T arg)=>arg;
```
Of course, going with a built-in makes sense too.
| |||
October 01 Re: Move Constructors - Converting Lvalues to Rvalues | ||||
|---|---|---|---|---|
| ||||
Posted in reply to Walter Bright | On 10/1/24 19:37, Walter Bright wrote:
> On 10/1/2024 12:27 AM, Dukc wrote:
>> Why special syntax? `move` is a DRuntime function so it's expected that it can have special semantics, even without special syntax.
>
> Converting to an rvalue is an enabler of other functions, too, not just move. __rvalue is a building block, not a complete function.
`move` currently accepts an lvalue and moves it into the return value, leaving `.init` in the argument.
I guess the new implementation you have in mind is something like the following?
```d
auto move(T)(ref T arg)=>__rvalue(arg);
```
| |||
October 01 Re: Move Constructors - Converting Lvalues to Rvalues | ||||
|---|---|---|---|---|
| ||||
Posted in reply to Walter Bright | On Tuesday, 1 October 2024 at 17:37:37 UTC, Walter Bright wrote:
> On 10/1/2024 12:27 AM, Dukc wrote:
>> Why special syntax? `move` is a DRuntime function so it's expected that it can have special semantics, even without special syntax.
>
> Converting to an rvalue is an enabler of other functions, too, not just move. __rvalue is a building block, not a complete function.
The __rvalue route makes sense and is intuitive imo.
| |||
October 02 Re: Move Constructors - Converting Lvalues to Rvalues | ||||
|---|---|---|---|---|
| ||||
Posted in reply to Richard (Rikki) Andrew Cattermole | On Tuesday, 1 October 2024 at 03:07:02 UTC, Richard (Rikki) Andrew Cattermole wrote:
> On 01/10/2024 3:58 PM, Atila Neves wrote:
>> On Monday, 30 September 2024 at 20:28:05 UTC, Richard (Rikki) Andrew Cattermole wrote:
>>> I suspect that we're going in an entirely wrong direction with move constructors for two reasons:
>>>
>>> 1. Nobody has been able to answer what the purpose of them is, is it an optimization, is it ownership transfer system (which is better done with isolated).
>>
>> My understanding is that we need SSA in order to implement isolated. And so for now I'd say it's an optimisation mostly, but also bug prevention with move-only types.
>
> SSA? What? That has nothing to do with it.
Not according to Amaury.
| |||