[cxx-abi-dev] Transfer modes for parameters and return values
David Vandevoorde
daveed at edg.com
Wed Jun 3 23:12:33 UTC 2009
On Jun 3, 2009, at 6:39 PM, David Vandevoorde wrote:
>
> On Jun 3, 2009, at 5:26 PM, Jason Merrill wrote:
>
>> David Vandevoorde wrote:
>>> Hello again,
>>> In 3.1.1 and 3.1.4, the ABI specifies that "by value" class type
>>> parameters and class type return values are passed via the address
>>> of a reference if the class type has
>>> (a) a nontrivial destructor, or
>>> (b) a nontrivial copy constructor.
>>> Should we now also add to that:
>>> (c) a (nontrivial) move constructor
>>> ?
>>
>> I'm not sure. We need to pass by reference in the case of a
>> nontrivial copy constructor because it's invalid to do a bitwise
>> copy in that case. We need to do it in the case of a nontrivial
>> destructor so that the caller can control when the destructor is
>> run depending on copy elision. Neither of those really applies to
>> the move constructor.
>
>
> Consider the following example:
>
> struct S {
> S();
> S(S&&);
> private:
> S(S const&) = default; // Trivial copy constructor.
> };
>
> void f(S);
>
> int main() {
> f(S());
> }
>
> My understanding is that the move constructor must be called to pass
> the argument directly to f, and that the trivial copy constructor
> cannot be called as an extra step in that case. (I.e., although
> this is called "copy initialization", it's really very much like
> default initialization.)
I meant "...very much like direct initialization.)".
Daveed
>
> No?
>
> Daveed
>
More information about the cxx-abi-dev
mailing list