is_convertible
和is_assignable
之间的区别是什么?
为什么,
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
答案 0 :(得分:12)
一个不同之处在于论证是相反的。
is_convertible<From,To>
表示类型From
的表达式可以转换为To
类型。该标准根据返回To
的函数来定义此行,该函数包含行return create<From>();
,其中create<From>()
返回对From
的引用。因此,is_convertible<int,int&>
为false,因为您无法将 rvalue int
绑定到非const 左值引用int&
。< / p>
is_assignable<T,U>
表示类型U
的 rvalue 表达式可以分配给T
类型的表达式;也就是说,t = u;
格式正确。要指定的表达式被指定为函数调用,如果T
是左值引用,则返回左值引用,并且 rvalue 否则提及。这意味着is_assignable<T,U>
只有在T
是非const 左值引用类型时才能为真;因此<int,int&>
是假的。
我猜想VS2012要么允许分配给 xvalues ,要么使用is_assignable
的非标准检查,给出我认为不正确的结果。
请注意,一般来说,敞篷车并不意味着可分配,因为可能没有可访问的赋值运算符;并且assignable并不意味着可转换,因为可能有赋值运算符但没有可访问的转换构造函数或运算符。
答案 1 :(得分:3)
看起来像gcc中的错误,is_convertible
在此上下文中意味着:
int& foo()
{
return 3; //invalid
}
另一方面,is_assignable
在此上下文中意味着:
void foo(int& x, int y)
{
y = x; // valid
}