25

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
4

2 回答 2

14

一个区别是论点是相反的。

is_convertible<From,To>意味着 type 的表达式From可以转换为 type To。该标准根据返回的函数定义了这一点,该函数To包含返回对 . 的引用的return create<From>();行。所以是错误的,因为您不能将右值绑定到非 const左值引用。create<From>()Fromis_convertible<int,int&> intint&

is_assignable<T,U>表示可以将 type 的右值表达式U分配给 type 的表达式T;也就是说,那t = u;是格式良好的。要分配的表达式被指定为函数调用,如果是左值引用,则返回左值引用,否则返回右值引用。这意味着只有当它是非 const左值引用类型时才为真;因此对于 是错误的。Tis_assignable<T,U>T<int,int&>

我猜 VS2012 要么允许分配给xvalues,要么使用非标准检查 for is_assignable,给出我认为不正确的结果。

请注意,通常可转换并不意味着可赋值,因为可能没有可访问的赋值运算符;并且 assignable 并不意味着可转换,因为可能存在赋值运算符但没有可访问的转换构造函数或运算符。

于 2012-12-19T12:45:27.507 回答
3

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
}
于 2012-12-19T12:32:11.460 回答