is_convertible is_assignable有什么区别
What is the difference between is_convertible is_assignable
is_convertible
和is_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
}
相关文章:
- 为不同配置设置MSVC_RUNTIME_LIBRARY的正确方法是什么
- 警告处理为错误这里有什么问题
- 什么时候调用组成单元对象的析构函数
- #定义c-预处理器常量..我做错了什么
- 努力将整数转换为链表。不知道我在这里做错了什么
- C++我的数学有什么问题,为什么我的代码不能正确循环
- 这在C++ "It does not own the underlying data, and so is cheap to copy or assign"中意味着什么
- 警告的原因是什么:"when type is in parentheses, array cannot have dynamic size"?
- 这是什么意思:"member reference type 'Human *' is a pointer; did you mean to use '->'?"
- "The order of evaluation of expressions is left to right."是什么意思
- "useinbandfec is a unidirectional receive-only parameter"作品中是什么意思?
- "except that a default constructed array is not empty"是什么意思?
- Is STD::设置我应该使用什么来将对象组织到层次结构中
- "A uses B, which is being defined"是什么意思?
- "has-a"和"is-a"是什么意思?
- 这句话"a class is an object even if not instantiated"是什么意思?
- 在给定的代码示例中,在 vector::p ush_back() 中"the argument is copied (or moved)"到底是什么意思?
- 什么是"is-implemented-in-terms-of"关系,何时应使用它?
- 错误是什么意思"void-value is not ignored"以及如何删除它?
- "is"这个词在 C++ 中的算法中是什么意思