gpt4 book ai didi

c++ - 为什么调用复制构造函数而不是 move 构造函数?

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

请看下面的示例代码:

   #include <iostream>

struct Foo {
Foo() { std::cout << "Default!\n"; }
Foo(const Foo& foo) { std::cout << "Copy!\n"; }
Foo(Foo&& foo) { std::cout << "Move!\n"; }
};

struct Bar {
Foo foo;
Bar() {}
Bar(Bar &that) : foo(that.foo) {}
Bar(Bar &&that) : foo(std::move(that.foo)) {}
};

Bar f() {
Bar bar;
return bar;
}

int main() {
Bar bar(f());
}

我期望这段代码的输出应该是:
Default!
Move!

但我得到的是:
Default!
Copy!

我看不出为什么调用复制构造函数而不是 move 构造函数的任何原因。如果我把关键字 constBar &that 前面在 struct Bar 的复制构造函数的声明中,我得到了正确的结果。我知道在许多情况下,最好采用 const 左值引用,而不仅仅是复制构造函数的左值引用,但我只想知道发生这种情况的原因。

为什么在这个例子中 Bar &已优先于 Bar &&即使 f() 的返回值应该被视为prvalue?为什么关键字 const解决问题?是否 const真的能解决问题吗?它与RVO(返回值优化)有关吗?或者,这只是一个编译器错误?

我已经在 Visual C++ 2012 年 11 月 CTP 上测试了这个示例。

我在这里发现了一个类似的问题:

Copy constructor is being called instead of the move constructor

但我还是不明白为什么。

谁能帮我?

最佳答案

您的问题可能已经回答 here .

A temporary object cannot bind to a non-const reference. The copy constructor must take a reference to a const object to be able to make copies of temporary objects.



另一件事是临时对象不能修改,因为它们很快就会被销毁。持有对临时对象的引用可能会因为粗心而对不存在的对象进行修改。

关于c++ - 为什么调用复制构造函数而不是 move 构造函数?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/29459040/

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