is_assignable <>的结果不一致

chi*_*yer 7 c++

可能重复:
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;
Run Code Online (Sandbox Code Playgroud)

vs2012的结果是:

true
true
true
true
true
true
Run Code Online (Sandbox Code Playgroud)

在gcc4.7.2我得到:

false
false
true
true
false
false
Run Code Online (Sandbox Code Playgroud)

根据标准,哪个结果是正确的?

Mik*_*our 6

is_assignable<T,U> 如果:

表达declval<T>() = declval<U>()形式良好

declval<T>声明为返回引用的函数T:

template <class T>
  typename add_rvalue_reference<T>::type declval() noexcept;
Run Code Online (Sandbox Code Playgroud)

其中add_rvalue_reference<T>::typervalue引用类型(T&&)if T是对象或函数类型,T如果是引用类型,则自身.

这意味着is_assignable<T,U>只有在T非const 左值引用类型时才能为true .如果它是一个对象类型,那么它add_rvalue_reference<T>::type是一个右值引用类型; 所以表达式declval<T>()是一个xvalue,无法分配.

所以,除非我误读了标准,否则GCC是正确的,VS2012是错误的.即使它似乎更有意义is_assignable<int,int>,但事实并非如此.