is_assignable的结果不一致<> [英] Inconsistent results of is_assignable<>
问题描述
可能重复:
is_convertible is_assignable 之间的区别
我使用这个测试代码:
cout<<std::is_assignable<int, int>::value<<endl;
cout<<std::is_assignable<int, char>::value<<endl;
cout<<std::is_assignable<int&, int>::value<<endl;
cout<<std::is_assignable<int&, char>::value<<endl;
cout<<std::is_assignable<int, int&>::value<<endl;
cout<<std::is_assignable<int, char&>::value<<endl;
vs2012中的结果为:
The result in vs2012 is:
true
true
true
true
true
true
在gcc4.7.2我得到:
In gcc4.7.2 I get:
false
false
true
true
false
false
推荐答案
is_assignable< T,U>
is true if:
is_assignable<T,U>
is true if:
表达式
declval< T>()= declval< U>
格式正确
declval< T>
被声明为返回对 T
的引用的函数:
declval<T>
is declared as a function returning a reference to T
:
template <class T>
typename add_rvalue_reference<T>::type declval() noexcept;
其中 add_rvalue_reference< T> :: type
是引用类型( T&&
)if T
这意味着函数类型,或
只能在 T
is_assignable< T,U> T
是非常数引用类型时为真。如果它是一个对象类型,则 add_rvalue_reference< T> :: type
是一个 rvalue 引用类型;因此表达式 declval< T>()
是不能赋值的 xvalue 。
This means that is_assignable<T,U>
can only be true if T
is a non-const lvalue reference type. If it's an object type, then add_rvalue_reference<T>::type
is an rvalue reference type; so the expression declval<T>()
is an xvalue, which cannot be assigned to.
所以,除非我误读了标准,GCC是正确的,VS2012是错误的。即使对于 is_assignable< int,int>
似乎更有意义,也不是。
So, unless I've misread the standard, GCC is correct and VS2012 is wrong. Even if it might seem to make more sense for is_assignable<int,int>
to be true, it is not.
这篇关于is_assignable的结果不一致<>的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!