Re: Overloading reference operator
???? Tiib <ootiib@hot.ee> writes:
On May 14, 12:57??pm, Kai-Uwe Bux <jkherci...@gmx.net> wrote:
???? Tiib wrote:
[basic.lval]/6 say that result of conversion of non-reference type is
rvalue. I think there is no difference if it is implicit or explicit
conversion.
Here is [3.10/6] ([3.10] is [basic.lval]):
?? An expression which holds a temporary object resulting from a cast to a
?? nonreference type is an rvalue (this includes the explicit creation of an
?? object using functional notation (5.2.3)).
The cast is required to go _to_ a non-reference type (your wording made it
sound as though the provision applies to a conversion _from_ a non-reference
type).
Yep. I did misread myself. Ok. Then my best bet is that something in
[13.3.1.2] is on our way.
Hmm.
My copy of standard claims:
<quote [13.3.1.2]/4>
For the built-in assignment operators, conversions of the left operand
are restricted as follows:
??? no temporaries are introduced to hold the left operand, and
??? no user-defined conversions are applied to the left operand to
achieve a type match with the left-most parameter of a built-in
candidate.
</quote>
No user T& operator applied to left guy since int = int is built in
assignment operator, yes?
I'm assuming that we're still referring to the OP's code here which,
corrected (and reduced), was:
template<class T>
class MyClass
{
public:
MyClass() : m_data(10) { }
operator T&() { return m_data; }
private:
T m_data;
};
int main()
{
MyClass<int> instance;
// <snip />
instance = 105; // this gives compile error. Why ?
return 0;
}
In this context, I think that ??13.3.1.2/4 is indeed what prevents this
from working. With no user-defined assignment operator, only built-in
operators are available. The built-in:
int& operator=(int&, int)
won't be considered because, according to ??13.3.1.2/4, "no user-defined
conversions are applied to the left operand to achieve a type match with
the left-most parameter of a built-in candidate," as you suggest.
Regards
Paul Bibbings