gpt4 book ai didi

c++ - 返回本地对象是否需要移动语义?

转载 作者:IT老高 更新时间:2023-10-28 22:16:39 25 4
gpt4 key购买 nike

当按值返回本地对象时,C++ 编译器可能利用移动语义优化不必要的拷贝(复制省略)。
可能优化”意味着如果不满足适当的条件,则行为应退回到基于复制的默认按值返回语义。
因此,据我了解,按值返回可复制对象总是有效的。

但编译器(clang 和 gcc)似乎不同意我的解释,如下面的 MWE 所示。

class Foo {
public:
Foo();
Foo(const Foo&);
Foo(Foo&&) = delete;
}

Foo f() { return Foo(); } // error: call to explicitly deleted constructor of 'Foo'
Foo g() { Foo a; return a; } // gcc complains, clang is fine
Foo x = g(); // error: call to explicitly deleted constructor of 'A'

Q1:按值返回是否要求对象是可移动的?
Q2:如果没有,gcc 和 clang 在我的 MWE 上是否表现不正常,还是我错过了其他东西?

最佳答案

您只是满足重载解析的预期行为:Foo() 是一个右值,因此重载解析找到构造函数 Foo(Foo&&) 作为最佳匹配。由于删除了该重载,因此您的程序格式错误。此外,还有一个特殊的规则是 Foo a; return a; 也将执行重载决议,就好像 a 首先是一个右值。 (该规则基本上适用于 return 语句符合复制省略的条件。)

这一切都按预期工作。是你删除了重载,所以你明确要求禁止这种结构。

请注意,“真实”代码通常不会遇到这个障碍,因为一旦您声明了复制构造函数,您的类将根本没有任何移动构造函数。但是你特意说,“不,实际上我确实想要一个移动构造函数,如果有人试图使用它,我希望它是一个错误”。

关于c++ - 返回本地对象是否需要移动语义?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/29164188/

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