首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >如何在declval<_Dest>() = declval<_Src>()中解释is_assignable

如何在declval<_Dest>() = declval<_Src>()中解释is_assignable
EN

Stack Overflow用户
提问于 2013-12-06 02:35:23
回答 1查看 219关注 0票数 4

我正在努力弄清楚如何在declval<_Dest>() = declval<_Src>()的实现中解释is_assignable。

解密将类型转换为引用。有鉴于此,我将该表达式翻译为以下四种可能性之一:

  1. _Dest&& = _Src&&
  2. _Dest&& = _Src&
  3. _Dest& = _Src&&
  4. _Dest& = _Src&

然后我创建了两个助手函数。

代码语言:javascript
复制
template <typename T> T rvalue();
template <typename T> T& lvalue();

据我理解,这四个表达式可以通过使用模板函数来实现。

  1. _Dest&& = _Src&& -> rvalue<_Dest>() = rvalue<_Src>()

其他三个人也是如此。

然后我模拟了解密类型(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并不同意。编译器同样不喜欢分配给rvalue。然而,对于所有四种可能性,is_assignable都返回true。

我的问题是

  • 我是否正确地解释了declval<_Dest>() = declval<_Src>()?用一句话来说,这真的转化为四种可能性吗?如果是,是否可以将每个函数映射到模板函数表达式?
  • 为什么编译器和is_assignable在_Dest=double,_Src=int的问题上意见不一致?

谢谢。

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2013-12-06 03:33:12

std::declval实际上被指定为是(C++11§20.2.4解密p1):

代码语言:javascript
复制
template <class T>
typename add_rvalue_reference<T>::type declval() noexcept;

引用折叠规则(§8.3.2 dcl.ref p6)的结果是,当T是lvalue引用类型时,declval返回一个lvalue引用,否则返回一个rvalue引用。所以是的,你的解释是正确的。

如果您的编译器认为double&&可以从任何类型分配,那么它就有一个bug。§5.17 expr.ass p1指出:

赋值运算符(=)和复合赋值运算符都是由右向左分组的.它们都需要一个可修改的lvalue作为它们的左操作数,并返回一个引用左操作数的lvalue。

强调我的。

许多程序员选择通过使用lvalue引用限定符声明赋值操作符来模拟这种行为--只对lvalue进行测试--使用他们自己的类型:

代码语言:javascript
复制
class foo {
  foo& operator = (const foo&) & = default;
  foo& operator = (foo&&) & = default;
};
票数 3
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/20414883

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档