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 中的结果是:
true
true
true
true
true
true
在 gcc4.7.2 中,我得到:
false
false
true
true
false
false
根据标准,哪个结果是正确的?
>如果为真,则is_assignable<T,U>
为真:
表达式
declval<T>() = declval<U>()
格式正确
declval<T>
被声明为返回对T
的引用的函数:
template <class T>
typename add_rvalue_reference<T>::type declval() noexcept;
其中add_rvalue_reference<T>::type
是右值引用类型(T&&
如果它是对象或函数类型),则T
是右值引用类型,如果是引用类型,则T
本身。
这意味着,仅当T
是非常量左值引用类型时,is_assignable<T,U>
才能为 true。如果是对象类型,则add_rvalue_reference<T>::type
是右值引用类型;因此,表达式declval<T>()
是一个x值,不能分配给它。
所以,除非我误读了标准,否则GCC是正确的,VS2012是错误的。即使is_assignable<int,int>
为真似乎更有意义,但事实并非如此。
当declval<T>() = declval<U>()
格式正确且declval<T>
定义为返回add_rvalue_reference<T>::type
的函数时,is_assignable<T,U>::value
定义为true。
我们必须记住,赋值仅对可修改的左操作数有效。还要记住参考折叠的规则(尤其是最后两个):
T& & -> T&
T&& & -> T&
T& && -> T&
T&& && -> T&&
所以每种情况:
is_assignable<int, int>
和is_assignable<int, char>
我们可以将返回右值引用(x值)的函数的结果分配给另一个返回右值引用(另一个 x值)的函数的结果吗?不,我们不能。这应该是
false
.std::is_assignable<int&, int>
和std::is_assignable<int&, char>
我们是否可以将返回右值引用(x值)的函数的结果分配给返回左值引用(左值)的函数的结果。我们当然可以。这应该是
true
.std::is_assignable<int, int&>
和std::is_assignable<int, char&>
我们是否可以将返回左值引用(左值)的函数的结果分配给返回右值引用(x值)的函数的结果。不,我们不能。这应该是
false
.
所以我说海湾合作委员会就在这里。
- 为什么"do while"循环不断退出,即使条件计算结果为 false?
- valgrind-hellgrind与泄漏检查的结果不同
- 用C++20 fmt限制结果的总大小
- 如何返回一个类的两个对象相加的结果
- 使用QProcess执行命令,并将结果存储在QStringList中
- 如果我std::dynamic_pointer_cast并且底层dynamic_cast的结果为null,那么返回的sh
- 在没有定义返回类型的函数中返回布尔值,并将结果保存在无错误的char编译中-为什么
- 序列化,没有库的整数,得到奇怪的结果
- 使用取消引用的指针的多态性会产生意外的结果.为什么?
- 在更改for循环的第三部分后,未使用for循环结果
- EASTL矢量<向量<int>>连续的
- 使用++运算符会导致意外的结果
- 为什么在逗号分隔符上下文中将预增量的结果强制转换为void
- C++Brute Force攻击函数不会返回结果
- 你好。。。id_public变量不应该给出结果为 81 和 86 吗?为什么它为两个派生类占用不同的内存位置?
- 算术运算的结果类似于:C浮点变量中的1/3
- ";结果类型必须是可从输入范围的值类型""构造的;创建std::vector时
- 密码登录程序将永远循环并显示不正确的结果
- 如何让C++'tally up'结果并制定计划?
- 为什么这个程序的结果是3 "born"?和 4 死