[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