is_convertible is_assignable之间有什么区别?

时间:2012-12-19 12:22:53

标签: c++ typetraits

is_convertibleis_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

2 个答案:

答案 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
}