Re: A non-const reference may only be bound to an lvalue?
On Dec 17, 6:05 pm, "Igor Tandetnik" <itandet...@mvps.org> wrote:
"George" <Geo...@discussions.microsoft.com> wrote in message
news:434F855F-2E48-47F8-BD84-75E751D3BC15@microsoft.com
I have some difficulties to understand below code about how it is
executed,
return const_cast<T>( static_cast<const std::vector<T>> (vec)[i]);
You are not alone. I believe the example is incorrect. It is also not
particularly illustrative, since you could just as well write
const T& operator[](size_t i) const
{
return vec[i];
}
T& operator[](size_t i)
{
return vec[i];
}
and it would be shorter and clearer without const_cast.
Yes, it is incorrect and for plenty of reasons (didn't have a compiler
handy). Apologies about that. The correct version would be:
T& operator[](size_t i)
{
//return const_cast<T>( static_cast<const std::vector<T>
(vec)[i]);
return const_cast<T&>( static_cast<const A* >(this)-
vec[i]);
}
The static_cast gives const-ness to this and then the vec[i] would
invoke const overload for operator[] and then cast away the constness
of the returned value and give it back to the caller.
Yes, I also agree it is not very illustrative in that there's a
simpler way to do it. But it was just a sample to show a usage, the
function could be a more complicated one than operator[] which in
turns invokes operator[] of vector. And in that case the usage would
be legitimate in that it makes the code more maintainable with core
implementation abstracted into one function only that can be re-used
from two places. Apologies once again for the untested bad code. :(