7

我最近一直在玩右值引用,我遇到了一个奇怪的问题。让我们定义一个名为 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是使用复制构造函数而不是移动构造函数构造的。但是,如果我以这种方式指定构造函数:

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

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

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

谢谢你的帮助。PMJ

4

1 回答 1

8

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

理由是这样的

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

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

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

于 2011-08-23T19:15:51.917 回答