Re: rvalues and lvalues
Am 07.11.2011 20:52, schrieb Arne Mertz:
On Nov 4, 12:50 am, Daniel Kr?gler<daniel.krueg...@googlemail.com>
wrote:
Am 03.11.2011 19:15, schrieb Jerry:
template<class T,
class = typename std::enable_if<is_vector<T>::value>::type
std::vector<int> & operator<<(T&& x,
const std::vector<int>::value_type& y)
{
x.push_back(y);
return x;
}
Hi Daniel, wouldn't your implementation remove the rvalue-ness from
the first argument?
It would, but I intentionally suggested to do that in this case
nonetheless assuming that the OP intended one of the rare use cases,
where this makes sense as in:
template <class charT, class traits, class T>
basic_ostream<charT, traits>&
operator<<(basic_ostream<charT, traits>&& os, const T& x);
You *could* use this in a wrong way, but I would argue that this so rare
that the advantages of this idiom win over the possible risk of misusage.
You could write something like this:
int main()
{
std::vector<int>& ivr = std::vector<int>()<< 5;
ivr<< 6<< 7;
}
This binds a non-const lvalue-ref to an rvalue, followed by happily
crashing the application...
Certainly, and I should probably have suggested to the OP *not* to add
such an overload anyway (It causes problems all the way, because the
operator overload cannot be added to namespace std with all the
follow-up problems in regard to ADL). But then I looked at the problem
as a variant of the IO insertion and suggested a similar solution. So, I
should finish with: "No, don't add such overloads to your code unless
you are just playing with the language and don't do serious code
writing" ;-)
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! ]