What is the difference between is_convertible
and is_assignable
?
Why,
in vs2012
is_convertible<int, int&> is false
is_assignable<int, int&> is true
in gcc4.7.2
is_convertible<int, int&> is false
is_assignable<int, int&> is false
One difference is that the arguments are the other way round.
is_convertible<From,To>
means that an expression of type From
can be converted to type To
. The standard defines this in terms of a function returning To
containing a line return create<From>();
where create<From>()
returns a reference to From
. So is_convertible<int,int&>
is false, since you can't bind an rvalue int
to a non-const lvalue reference int&
.
is_assignable<T,U>
means that an rvalue expression of type U
can be assigned to an expression of type T
; that is, that t = u;
is well-formed. The expression to be assigned to is specified as a function call returning an lvalue reference if T
is an lvalue reference, and an rvalue reference otherwise. This means that is_assignable<T,U>
can only be true if T
is a non-const lvalue reference type; hence being false for <int,int&>
.
I would guess that VS2012 either allows assignment to xvalues, or uses a non-standard check for is_assignable
, giving what I think is an incorrect result.
Note that in general convertible doesn't imply assignable, since there may be no accessible assignment operator; and assignable doesn't imply convertible, since there may be an assignment operator but no accessible conversion constructor or operator.
Seems like a bug in gcc, is_convertible
in this context means that:
int& foo()
{
return 3; //invalid
}
On the other hand is_assignable
in this context means that:
void foo(int& x, int y)
{
y = x; // valid
}
If you love us? You can donate to us via Paypal or buy me a coffee so we can maintain and grow! Thank you!
Donate Us With