初始化列表中的右值引用用法
我最近一直在使用 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 技术交流群。
绑定邮箱获取回复消息
由于您还没有绑定你的真实邮箱,如果其他用户或者作者回复了您的评论,将不能在第一时间通知您!
发布评论
评论(1)
在函数(或构造函数)内部,命名参数是左值,即使它被声明为右值引用。
基本原理类似于
编译器应该考虑从对象
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
In which of these calls should the compiler consider moving from the object
v
?None of them, unless you do it explicitly.