gpt4 book ai didi

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

转载 作者:塔克拉玛干 更新时间:2023-11-03 00:50:22 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/40600970/

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