Re: Why you should never use a const& parameter to initialize a const& member variable!
On 4 Feb., 14:17, "Martin B." <0xCDCDC...@gmx.at> wrote:
Daniel Kr?gler wrote:
[..]
While I agree that this *can* cause a problem,
I still use references to const in examples
like yours - in C++03 you have to take care here.
I say so, because there are numerous places,
where this could cause problems - just remember
a call of the std::min or std::max functions.
If the compared objects are really large one's
I don't want to copy them, therefore I may want
to get the result by reference (to const) as well.
I'm not entirely sure what you mean here. My Better object still only
uses a const& member, but the initialization is done via a pointer. So
the performance should be exactly the same?
I didn't want to imply that const& is more efficient
than your pointer approach. I only wanted to highlight
that your constructor situation belongs only to one
family of these problems. I don't assume that you
want suggest that std::min should take arguments
by pointer as well, or do you?
In C++0x there is a nice way of preventing the
problem you mention: Just add an overload of the
corresponding function which accepts an rvalue
reference of the type and define the function
as deleted:
class Bad {
int const& tracker_;
public:
explicit Bad(int const&&) = delete;
explicit Bad(int const& to_track)
: tracker_(to_track)
{ }
[...]
};
I've never worked with C++0x. Am I correct in assuming that the deleted
function binds to temporaries (like fn return value or implicit
temporary from say a short or char) first and then the one that binds to
non-temporaries isn't considered anymore by the compiler?
That comes near. What happens is the following:
Given your example with rvalues as arguments
the compiler performs overload resolution
given the two constructors. For rvalues, the
deleted constructor overload will be selected.
*If* a deleted function is selected by
overload resolution (or by other way that would
refer to that function), the program becomes
ill-formed, which requires a diagnostic
("compile error" in our usual way of describing
the compiler's behavior).
HTH & Greetings from Bremen,
Daniel Kr?gler
--
[ See http://www.gotw.ca/resources/clcm.htm for info about ]
[ comp.lang.c++.moderated. First time posters: Do this! ]