is_convertible
和 和有什么不一样is_assignable
?
为什么,
在vs2012中
is_convertible<int, int&> is false
is_assignable<int, int&> is true
在 gcc4.7.2
is_convertible<int, int&> is false
is_assignable<int, int&> is false
is_convertible
和 和有什么不一样is_assignable
?
为什么,
在vs2012中
is_convertible<int, int&> is false
is_assignable<int, int&> is true
在 gcc4.7.2
is_convertible<int, int&> is false
is_assignable<int, int&> is false
一个区别是论点是相反的。
is_convertible<From,To>
意味着 type 的表达式From
可以转换为 type To
。该标准根据返回的函数定义了这一点,该函数To
包含返回对 . 的引用的return create<From>();
行。所以是错误的,因为您不能将右值绑定到非 const左值引用。create<From>()
From
is_convertible<int,int&>
int
int&
is_assignable<T,U>
表示可以将 type 的右值表达式U
分配给 type 的表达式T
;也就是说,那t = u;
是格式良好的。要分配的表达式被指定为函数调用,如果是左值引用,则返回左值引用,否则返回右值引用。这意味着只有当它是非 const左值引用类型时才为真;因此对于 是错误的。T
is_assignable<T,U>
T
<int,int&>
我猜 VS2012 要么允许分配给xvalues,要么使用非标准检查 for is_assignable
,给出我认为不正确的结果。
请注意,通常可转换并不意味着可赋值,因为可能没有可访问的赋值运算符;并且 assignable 并不意味着可转换,因为可能存在赋值运算符但没有可访问的转换构造函数或运算符。
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
}