is_convertible is_assignable有什么区别

What is the difference between is_convertible is_assignable

本文关键字:is 什么 区别 assignable convertible      更新时间:2023-10-16

is_convertibleis_assignable有什么区别?

为什么

在VS2012中

is_convertible<int, int&> is false
is_assignable<int, int&> is true

在 GCC 4.7.2 中

is_convertible<int, int&> is false
is_assignable<int, int&> is false

一个区别是参数是相反的。

is_convertible<From,To>表示可以将类型From的表达式转换为类型To。该标准将其定义为返回包含行To的函数return create<From>();其中create<From>()返回对From的引用。所以is_convertible<int,int&>是假的,因为您不能将右值int绑定到非常量左值引用int&

is_assignable<T,U>意味着类型U右值表达式可以分配给类型T的表达式;也就是说,t = u;是格式正确的。要赋值的表达式被指定为函数调用,如果T左值引用,则返回左值引用,否则则返回右值引用。这意味着is_assignable<T,U>只有在T是非常量左值引用类型时才可以为 true;因此对<int,int&>来说是错误的.

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

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

似乎是gcc 中的一个错误,在这种情况下is_convertible意味着:

int& foo()
{
return 3; //invalid
}

另一方面,在这种情况下is_assignable意味着:

void foo(int& x, int y)
{
y = x; // valid
}