初始化列表中的Rvalue引用用法

时间:2011-08-23 18:59:19

标签: rvalue-reference c++11

我最近一直在玩Rvalue参考,我遇到了一个奇怪的问题。让我们定义一个名为Foo的简单类,它包含vector< int >

class Foo
{
public:

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

private:

    std::vector< int > v_;
};

可以通过传递Foo临时值来构建vector< int >实例:

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

现在,当我尝试单步执行此代码时,我注意到Foo中的向量是使用copy-constructor而不是move-constructor构造的。但是,如果我这样指定构造函数:

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

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

顺便说一下,我正在使用GCC 4.6和-std = c ++ 0x选项。

感谢您的帮助。 PMJ

1 个答案:

答案 0 :(得分:7)

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

基本原理类似于

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

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

他们都没有,除非你明确地这样做。