gpt4 book ai didi

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

转载 作者:行者123 更新时间:2023-12-04 11:43:23 25 4
gpt4 key购买 nike

我最近一直在玩 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 中的向量是使用复制构造函数而不是移动构造函数构造的。但是,如果我以这种方式指定构造函数:
Foo(std::vector< int >&& v)
: v_(std::move(v))
{}

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

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

谢谢你的帮助。
PMJ

最佳答案

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

理由是这样的

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

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

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

关于rvalue-reference - 初始化列表中的右值引用用法,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/7166133/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com