如何在is_assignable中解释 declval<_Dest>() = declval<_Src>()
How to interpret declval<_Dest>() = declval<_Src>() in is_assignable
我正试图弄清楚如何解释declval<_Dest>()=递减<_Src>()在is_assignable的实现中。
declval将类型转换为引用。鉴于此,我将表达式转换为以下四种可能性之一:
- _Dest&;=_Src&
- _Dest&;=_Src&
- _目的地&=_Src&
- _目的地&=_Src&
然后我创建了两个辅助函数。
template <typename T> T rvalue();
template <typename T> T& lvalue();
我的理解是,这四个表达式可以通过使用模板函数来实现。
- _Dest&;=_Src&;----->右值<_Dest>()=右值<_Src>()
其他三个也是如此。
然后我模拟了decltype(declval<_Dest>()=declval<_Src>(),..)通过编译三对具体类型的每种可能性的模板化函数版本。
- _Dest=int,_Src=int。编译器接受#3和#4。is_assignable为#3和#4返回true。他们同意了
- _Dest=int,_Src=double。与相同的结果
- _Dest=double,_Src=int。对于这一点,编译器和is_assignable并不一致。编译器再次不喜欢为右值赋值。但是,对于所有四种可能性,is_assignable都返回true
我的问题是
- 我把declval<_Dest>()=递减<_Src>()是否正确?换句话说,这真的可以转化为四种可能性吗。如果是,每一个都可以映射到模板化的函数表达式吗
- 为什么编译器和is_assignable在_Dest=double、_Src=int的情况下存在分歧
谢谢。
std::declval
实际上被指定为(C++11§20.2.4[delval]p1):
template <class T>
typename add_rvalue_reference<T>::type declval() noexcept;
引用折叠规则(§8.3.2[dcl.ref]p6)的结果是,当T
是左值引用类型时,declval
返回左值引用,否则返回右值引用。是的,你的解释是正确的。
如果编译器认为double&&
可以从任何类型赋值,那么它就有一个错误。§5.17【expr.ass】p1规定:
赋值运算符(
=
)和复合赋值运算符都是从右到左分组的。所有操作数都需要一个可修改的左值作为其左操作数,并返回一个引用左操作数的左值。
[强调我的]。
许多程序员选择用自己的类型来模拟这种行为——只对左值进行分类——通过用左值引用限定符声明赋值运算符:
class foo {
foo& operator = (const foo&) & = default;
foo& operator = (foo&&) & = default;
};
相关文章:
- 请解释这句话(cout<<1+int((a<b)^((b-a)&1) )<<endl
- 呼叫运营商<<临时
- 如何防止clang格式在流运算符调用之间添加换行符<<
- <<操作员在下面的行中工作
- EASTL矢量<向量<int>>连续的
- C - 创建矢量&lt; vector&lt; double&gt;&gt;矩阵具有分配而不是inizializ
- 为什么将此对向量&lt; map&lt; int,int&gt;&gt;中的地图进行更新.失败
- C :对矢量进行排序&lt; struct&gt;(结构有2个整数)基于结构的整数之一
- 明确的专业化“ CheckIntmap&lt;&gt;”实例化
- 什么是模板&lt;&gt;inline bla bla
- 编辑C Qlist&lt; object*&gt; gt;QML代码和一些QML警告中的模型
- eigen :: llt&lt;eigen :: matrixxd&gt;具有不完整的类型
- 错误,包括&lt; ctype&gt;在原子上使用C 11
- std::vector<;uint8_t>;当C++11/14启用时,手动复制而不是调用memcpy
- 如何加入向量&lt; int&gt;到C 中的单个INT
- 是std :: set&lt; std :: future&gt;不可能存在
- 是numeric_limits&lt; int&gt; :: is_modulo从逻辑上矛盾
- opencv 2.4.7在iOS错误背景_segm.hpp #include&lt; list&gt;未找到
- 在修改列表后,std :: list&lt; t&gt; :: end()的值是否会更改
- ///<评论></评论>在Visual Studio中