bug-bison
[Top][All Lists]
Advanced

[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]

Re: Automatially move from $n (was: C++11 move semantics)


From: Hans Åberg
Subject: Re: Automatially move from $n (was: C++11 move semantics)
Date: Sat, 15 Sep 2018 22:37:54 +0200

On 15 Sep 2018, at 22:10, Frank Heckenbach <address@hidden> wrote:
> 
> Hans Åberg wrote:
> 
>>>>>> The idea would be to write something equivalent to
>>>>>> return make_unique<foo>($1, $2, $3);
>>>>>> and the Bison writes something like
>>>>>> $$ = std::move(action_k(...return make_unique<foo>($1, $2, $3);...))
>>>>> 
>>>>> I don't follow you. What is action_k, and how would that cause
>>>>> moving from $1 etc.?
>>>> 
>>>> Action k in the switch statement.
>>> 
>>> Huh? I really don't get what your proposed syntax is supposed to
>>> mean. Is action_k supposed to be a lambda (what else could appear in
>>> an expression and contain a statement inside)? What would it do?
>> 
>> Just produce an r-value.
> 
> Again:
> 
> - make_unique already produces an rvalue
> 
> - (I'll ignore the "...return", since you didn't comment on it, I
>  assume it's a typo)
> 
> - Then, you say, action_k produces an rvalue, from an rvalue?
> 
> - Finally, std::move takes this rvalue and turns it into an rvalue
>  (because that's what std::move does).
> 
> Do you want a triple-r-value?
> 
> Sorry if I'm a bit cynical meanwhile, but I said I don't follow what
> you intend to do, so it would be nice to explain it with something
> more than half a sentence, really.

If I write:

A& h(A& a) {
  return a;
}

A&& h(A&& a) {
  return std::move(a);
}

int main() {
  A a, b;

  b = std::move(h(a));
  b = std::move(h(std::move(a)));

  return EXIT_SUCCESS;
}

Then if A only has copy assignment, that will be used, but if has that and move 
assignment or only move assignment, then move assignment will be used. No 
copying occurs with copy elision. Isn't that what you want?





reply via email to

[Prev in Thread] Current Thread [Next in Thread]