is_convertible is_assignable之间有什么区别?

chi*_*yer 23 c++ type-traits

is_convertible和之间有什么区别is_assignable

为什么,

在vs2012

is_convertible<int, int&> is false

is_assignable<int, int&> is true
Run Code Online (Sandbox Code Playgroud)

在gcc4.7.2中

is_convertible<int, int&> is false

is_assignable<int, int&> is false
Run Code Online (Sandbox Code Playgroud)

Mik*_*our 13

一个不同之处在于争论是相反的.

is_convertible<From,To>表示类型的表达式From可以转换为类型To.该标准在返回功能方面定义了该To含有线return create<From>();,其中create<From>()返回到参考From.所以is_convertible<int,int&>是错误的,因为你不能将rvalue 绑定int到非const 左值引用int&.

is_assignable<T,U>表示可以将类型的rvalue表达式U赋给类型的表达式T; 也就是说,这t = u;是一个良好的形式.要赋值的表达式被指定为函数调用,如果是引用则返回引用,否则返回右值引用.这意味着只有在非const 左值引用类型时才能为true ; 因此是假的.Tis_assignable<T,U>T<int,int&>

我猜想VS2012要么允许赋值给xvalues,要么使用非标准检查is_assignable,给出我认为不正确的结果.

注意,一般来说,敞篷车并不意味着可分配,因为可能没有可访问的赋值运算符; 并且assignable并不意味着可转换,因为可能有赋值运算符但没有可访问的转换构造函数或运算符.