
Boost : 
From: Peter Dimov (pdimov_at_[hidden])
Date: 20040109 14:55:23
David Abrahams wrote:
> hartmutkaiser_at_[hidden] (Hartmut Kaiser) writes:
>
>> David Abrahams wrote:
>>
>>>> Completely relying on MOJO or similar techniques would
>>> require, that
>>>> I'm able/allowed to _modify_ the base iterator code, which isn't
>>>> always true.
>>>
>>> I'm not talking about relying on MOJO, I'm talking about
>>> andrei's finding that on compilers that elide copies, passing
>>> objects by reference if they're just going to be copied
>>> anyway is almost always a mistake.
>>
>> Sorry, I've misunderstood.
>>
>> It seems to me, that Andrei wrote his 'Lying const' statements under
>> the strong impression, that ZUTO would work as expected. But AFAIR
>> ZUTO never worked as envisioned and therefor MOJO was developed. But
>> I'm not pushing you to use a const reference, it was merely a
>> question to understand the rationale behind this design decision.
>
> I don't feel pushed. I would like to do it, and have only one small
> reservation. If you could clear that matter up definitively I'd be
> very happy to make the change.
Enjoy:
#include <iostream>
struct X
{
X()
{
}
X(int)
{
}
X(X const &)
{
std::cout << "X(X const &)\n";
}
};
struct Y
{
X x_;
Y(X x): x_(x)
{
}
};
struct Y2
{
X x_;
Y2(X x);
};
struct Z
{
X x_;
Z(X const & x): x_(x)
{
}
};
struct Z2
{
X x_;
Z2(X const & x);
};
int main()
{
X x;
{
std::cout << "Y y(x);\n";
Y y(x);
}
{
std::cout << "Y y( (X()) )\n";
Y y( (X()) );
}
{
std::cout << "Y y(1)\n";
Y y(1);
}
{
std::cout << "Y2 y(x);\n";
Y2 y(x);
}
{
std::cout << "Y2 y( (X()) )\n";
Y2 y( (X()) );
}
{
std::cout << "Y2 y(1)\n";
Y2 y(1);
}
{
std::cout << "Z z(x);\n";
Z z(x);
}
{
std::cout << "Z z( (X()) )\n";
Z z( (X()) );
}
{
std::cout << "Z z(1)\n";
Z z(1);
}
{
std::cout << "Z2 z(x);\n";
Z2 z(x);
}
{
std::cout << "Z2 z( (X()) )\n";
Z2 z( (X()) );
}
{
std::cout << "Z2 z(1)\n";
Z2 z(1);
}
}
Y2::Y2(X x): x_(x)
{
}
Z2::Z2(X const & x): x_(x)
{
}
Executive summary: the reference wins. It doesn't really matter. You knew
that already.
Boost list run by bdawes at acm.org, gregod at cs.rpi.edu, cpdaniel at pacbell.net, john at johnmaddock.co.uk