![]() |
1
8
根据FCD,GCC做得不对。联邦检察官说
你的案子
现在,重载解析不会直接使用引用绑定来查看是否存在隐式转换序列。相反,它说
因此,超负荷的解决方案可以找出一个胜利者,即使这个胜利者实际上可能无法约束到这个论点。例如:
引用绑定位置
然而 ,该规则存在两个例外。这些是
因此,以下调用有效:
因此,您的示例调用
但是,如果你说
|
![]() |
2
6
这是你读到的标准草案中的一个缺陷。由于安全原因,这种缺陷产生了一些急于编辑的副作用,即不允许将右值引用绑定到lvalues。 你的直觉是对的。当然,即使初始值设定项是左值表达式,也不允许右值引用引用某个未命名的临时变量。毕竟,这就是右值引用的目的。你观察到的问题去年已经解决了。即将到来的标准将要求在示例中选择第二个重载,其中右值引用将引用一些临时字符串对象。 规则修正案将其纳入草案N3225.pdf(2010-11-27):
但N3225似乎错过了说什么
由于您的MSVC版本是在修复此问题之前发布的,因此它仍然根据旧规则处理右值引用。下一个MSVC版本将实现新的右值引用规则(由MSVC开发人员称为“右值引用2.1”)。 see link 。 |
![]() |
3
2
我没有看到道格在G++上提到的行为。G++4.5和4.4.3都调用
|
![]() |
4
1
如果你问我的话,现行标准草案中有很多事情需要澄清。编译器还在开发中,所以很难相信他们的帮助。 很明显,你的直觉是正确的,任何类型的临时性都应该绑定到右值引用。例如,?3.10,新的“分类法”部分,将临时值分类定义为rvalues。 问题可能是rr参数规范不足以调用临时创建。§5.2.2/5:“如果参数为常量引用类型,则在需要时引入临时对象。”这听起来似乎是排他的。 在第13.3.3.1/6节中似乎再次滑过裂缝:(重点是矿山)
注意复制初始化
编辑: 实际上,在我的GCC版本中没有这个问题。我仍在尝试找出用户定义的转换序列的第二个标准转换与形成右值引用的关系。(RR地层是一个转换吗?或者它是由5.2.2/5之类的零散的小道消息决定的? |
![]() |
5
0
看看这个: http://blogs.msdn.com/vcblog/archive/2009/02/03/rvalue-references-c-0x-features-in-vc10-part-2.aspx 右值引用:重载分辨率 看起来您的情况是:“lvalues非常喜欢绑定到lvalue引用”。 |
![]() |
6
0
我不知道在最新版本的标准中这一点是否发生了变化,但它曾经说“如果有疑问,不要使用右值引用”。可能是因为兼容性的原因。
如果需要移动语义,请使用
|
![]() |
Holt 111111 · 函数类reduce函数中的转发和返回类型 7 年前 |
![]() |
3XX0 · 聚合引用成员和临时生存期 9 年前 |
|
Andrew Weatherly · Javascript仅临时更改 10 年前 |