C++完善功能转发
这是这个问题的后续。
2002 年关于该函数的论文 C++ 中的转发问题进行了以下观察:
这是目前采用的方法 通过 Boost.Bind 和 Boost.Lambda:
模板
无效 f(A1 和 a1, A2 和 a2, A3 和 a3) { 返回 g(a1, a2, a3); } 它的主要缺陷是它不能 转发非常量右值。这 参数推导创建一个非常量 参考,并且参考不能 绑定到参数。这使得 无辜的例子如
int main() { f(1,2,3); }
失败(违反 C1)。
我看到调用失败,但是解释正确吗?文字 1、2、3 不是 const 右值吗?
This is a followup to this question.
A 2002 paper on the function forwarding problem in C++ makes the following observation:
This is the method currently employed
by Boost.Bind and Boost.Lambda:template<class A1, class A2, class A3> void f(A1 & a1, A2 & a2, A3 & a3) { return g(a1, a2, a3); }
Its main deficiency is that it cannot
forward a non-const rvalue. The
argument deduction creates a non-const
reference, and the reference cannot
bind to the argument. This makes
innocent examples asint main() { f(1, 2, 3); }
fail (violates C1).
I see that the call fails, but is the explanation correct? Are not the literals 1, 2, 3 const rvalues?
如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。
绑定邮箱获取回复消息
由于您还没有绑定你的真实邮箱,如果其他用户或者作者回复了您的评论,将不能在第一时间通知您!
发布评论
评论(1)
文字 1, 2, 3 不是 const 右值吗?
不,它们只是 int 类型的右值。根据 C++ 标准,基本类型的右值不能被 const 限定。
调用失败,因为它们是右值 - 非常量引用不能绑定到右值。
如果函数采用 const A1 &、const A2&、const A3&,则调用可以正常进行,但在这种情况下,函数将无法修改参数。
编辑:参考我在 C++ 2003 标准中的第一个声明:(3.10.9)
Are not the literals 1, 2, 3 const rvalues?
No, they are just rvalues of type int. According to the C++ standard, rvalues of primitive types cannot be const-qualified.
The call fails because they are rvalues - non-const references cannot be bound to rvalues.
The call would be OK if the functions took
const A1 &, const A2&, const A3&
, but in this case the function wouldn't be able to modify the arguments.Edit: Reference to my first statement from the C++ 2003 standard : (3.10.9)