初始化列表中的右值引用用法

发布于 2024-12-01 10:26:22 字数 816 浏览 1 评论 0原文

我最近一直在使用 Rvalue 引用,并且遇到了一个奇怪的问题。让我们定义一些名为 Foo 的简单类,其中包含一个 vector<; int >

class Foo
{
public:

    Foo(std::vector< int >&& v)
        : v_(v)
    {}

private:

    std::vector< int > v_;
};

可以通过传递 vector< 来构造 Foo 实例。 int > 临时如下:

std::vector< int > temp;
Foo(std::move(temp));

现在,当我尝试单步执行此代码时,我注意到 Foo 内的向量是使用复制构造函数而不是移动构造函数构造的。但是,如果我以这种方式指定构造函数:

Foo(std::vector< int >&& v)
    : v_(std::move(v))
{}

那么,v_ 成员的移动构造函数将被适当地调用。为什么会这样呢?为什么初始化列表中需要冗余的 std::move(v) ?为什么编译器无法推断出调用向量移动构造函数的意图,因为相应的 Foo 构造函数参数被指定为右值引用?

顺便说一下,我使用的是带有 -std=c++0x 选项的 GCC 4.6。

感谢您的帮助。 PMJ

I've been playing with Rvalue references lately and I've been experiencing a strange issue. Let's define some simple class named Foo that contains a vector< int >:

class Foo
{
public:

    Foo(std::vector< int >&& v)
        : v_(v)
    {}

private:

    std::vector< int > v_;
};

A Foo instance can be constructed by passing a vector< int > temporary like this:

std::vector< int > temp;
Foo(std::move(temp));

Now, when I tried to step through this code, I noticed that the vector inside Foo is constructed using the copy-constructor instead of the move-constructor. However, if I specify the constructor this way instead:

Foo(std::vector< int >&& v)
    : v_(std::move(v))
{}

Then, the move-constructor of the v_ member is appropriately called. Why is that so? Why is the redundant std::move(v) necessary in the initialization list? Why is the compiler unable to deduce the intent to call the vector move-constructor since the corresponding Foo constructor argument is specified as a Rvalue reference?

By the way, I'm using GCC 4.6 with the -std=c++0x option.

Thanks for your help.
PMJ

如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

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

发布评论

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

评论(1

桃扇骨 2024-12-08 10:26:22

在函数(或构造函数)内部,命名参数是左值,即使它被声明为右值引用。

基本原理类似于

void foo(std::vector< int >&& v)
{
   bar(v);
   baz(v);
   boo(v);
   buz(v);
}

编译器应该考虑从对象 v 中移动哪些调用?

没有一个,除非你明确地这样做。

Inside the function (or constructor) a named parameter is an lvalue, even if it is declared as an rvalue reference.

The rationale is something like

void foo(std::vector< int >&& v)
{
   bar(v);
   baz(v);
   boo(v);
   buz(v);
}

In which of these calls should the compiler consider moving from the object v?

None of them, unless you do it explicitly.

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