Can you move a disabled this(this) struct in to a container type if it's an rvalue?
Steven Schveighoffer
schveiguy at gmail.com
Thu Dec 13 13:45:02 UTC 2018
On 12/13/18 8:17 AM, aliak wrote:
> On Thursday, 13 December 2018 at 12:08:22 UTC, Boris-Barboris wrote:
>> On Thursday, 13 December 2018 at 09:51:42 UTC, aliak wrote:
>>> [...]
>>
>>
>> You can just move in container constructor:
>>
>>
>> struct S {
>> @disable this(this);
>> this(int i) {}
>> }
>>
>> struct Container(T) {
>> T value;
>> this(T value) {
>> import std.algorithm: move;
>> this.value = value.move;
>> }
>> }
>>
>> void main() {
>> auto a = Container!S(S(3));
>> }
>
> Ah. Is there any case where you would not want to do that when you have
> a T value as parameter?
Probably not an issue. Note that if you take the parameter by value, the
T must be an rvalue if it has disabled postblit.
In other words, this wouldn't work:
S s;
auto a = Container!S(s); // error
So moving it isn't going to affect anything outside the function.
>
> And, what if it's "this()(auto ref T value)"? Then moving could be
> dangerous if the parameter was passed as a ref. Or maybe it just
> wouldn't compile?
What will happen is then you *could* take an already existing T as a
parameter, and the T you pass in will be destroyed upon calling the
constructor.
move resets the original to the .init value if it has a destructor or
postblit.
Is it dangerous? Probably not, but you may want to document for anyone
who uses the container to expect that.
-Steve
More information about the Digitalmars-d-learn
mailing list