C++完善功能转发

发布于 2024-10-20 21:17:33 字数 649 浏览 4 评论 0原文

这是这个问题的后续。

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 as

int 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 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。

评论(1

红焚 2024-10-27 21:17:33

文字 1, 2, 3 不是 const 右值吗?

不,它们只是 int 类型的右值。根据 C++ 标准,基本类型的右值不能被 const 限定。

调用失败,因为它们是右值 - 非常量引用不能绑定到右值。

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

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

类右值可以有 cv 限定
类型;非类右值总是有
cv-不合格类型。右值应
总是有完整的类型或空的
类型;除了这些类型之外,
左值也可以有不完整的
类型。

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)

Class rvalues can have cv-qualified
types; non-class rvalues always have
cv-unqualified types. Rvalues shall
always have complete types or the void
type; in addition to these types,
lvalues can also have incomplete
types.

~没有更多了~
我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
原文