$include_dir="/home/hyper-archives/boost/include"; include("$include_dir/msg-header.inc") ?>
From: Anthony Williams (anthony.williamsNOSPAM_at_[hidden])
Date: 2004-02-10 05:10:10
David Abrahams <dave_at_[hidden]> writes:
> Brian McNamara <lorgon_at_[hidden]> writes:
>
>> On Sun, Feb 08, 2004 at 11:39:51AM -0500, David Abrahams wrote:
>>> Brian McNamara <lorgon_at_[hidden]> writes:
>>> > David Abrahams writes:
>>> >> 12.2/1 says that the act of binding an rvalue to a (const) reference
>>> >> creates a temporary (which may be elided). The creation of the
>>> >> temporary requires the existence of a copy ctor with a const&
>>> >> argument. As far as I know, that rule serves no useful purpose, but I
>>> >> may have missed something.
>>> >
>>> > I am not sure what portion of the rule you don't like. Is it the fact
>>> > that they point to a particular copy constructor (the const& one),
>>> > rather than just any available/visible/something copy constructor?
>>>
>>> No, it's the fact that any additional temporary at all (and thus, a
>>> copy ctor) is needed.
>>>
>>> > In test10, what do you 'want' to happen here:
>>> > sink2( <a temporary object, that is, an rvalue> );
>>>
>>> It should bind a const reference to the temporary without complaining
>>> that the temporary can't be copied.
>>
>> I see. What about
>>
>> const X& x = source(); // 12.2/5
>>
>> ? Or something.
>
> That's exactly the case I'm talking about.
>
>> I am trying to find the 'hard' cases where the
>> compiler might not be able to easily make the temporary have the right
>> 'lifetime', and thus require an extra copy.
>
> I don't see any problem here. There's no problem getting the rvalue
> out of source(), or sink(source()) would fail. Furthermore, no
> compiler I've ever seen will actually make the allowed temporary in
> that case.
How about
struct X{};
struct Y
{
std::string s;
X x;
std::vector<int> v;
};
Y ySource();
const X& x=ySource().x;
This strikes me as more likely to cause a copy than a straight-forward binding
from an X temporary.
Anthony
-- Anthony Williams Senior Software Engineer, Beran Instruments Ltd. Remove NOSPAM when replying, for timely response.