繁体   English   中英

C ++完美函数转发

[英]C++ Perfect Function Forwarding

这是这个问题的后续内容。

2002年关于C ++中函数转发问题的论文做了以下观察:

这是Boost.Bind和Boost.Lambda当前采用的方法:

 template<class A1, class A2, class A3> void f(A1 & a1, A2 & a2, A3 & a3) { return g(a1, a2, a3); } 

它的主要缺点是它不能转发非常数rvalue。 参数推导创建非const引用,并且引用不能绑定到参数。 这就是无辜的例子

 int main() { f(1, 2, 3); } 

失败(违反C1)。

我看到呼叫失败,但解释是否正确? 不是文字1,2,3常量值吗?

Are not the literals 1, 2, 3 const rvalues?

不,它们只是int类型的rvalues。 根据C ++标准,原始类型的rvalues不能是const限定的。

调用失败,因为它们是rvalues - 非const引用不能绑定到rvalues。

如果函数采用const A1 &, const A2&, const A3& ,则调用将是正常的,但在这种情况下,函数将无法修改参数。

编辑:参考我在C ++ 2003标准中的第一个语句:(3.10.9)

类rvalues可以具有cv限定类型; 非类rvalues始终具有cv不合格类型。 Rvalues应始终具有完整类型或空白类型; 除了这些类型,左值也可以有不完整的类型。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM