我用这个测试代码:
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)
根据标准,哪个结果是正确的?
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>::type是rvalue引用类型(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>,但事实并非如此.
| 归档时间: |
|
| 查看次数: |
188 次 |
| 最近记录: |