is_assignable的结果不一致<> [英] Inconsistent results of is_assignable<>

查看:184
本文介绍了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的结果不一致&lt;&gt;的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!

查看全文
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆