返回 *&object 时是否允许复制/移动省略?

Is copy/move elision allowed when returning *&object?

本文关键字:复制 移动省 许复制 object 是否 返回      更新时间:2023-10-16

看看这段代码:

#include <stdio.h>
struct Foo {
Foo() { }
Foo(const Foo &) { printf("copyn"); }
Foo(Foo &&) { printf("moven"); }
};
Foo getFoo() {
Foo f;
return *&f;
}
int main() {
getFoo();
}

C++14 标准说 (12.8/31( 复制/移动省略允许:

在具有类返回类型的函数的 return 语句中,当 表达式是非易失性自动对象的名称(除了 函数或捕获子句参数(具有相同的 cv- 非限定条件 类型作为函数返回类型,复制/移动操作可以是 通过将自动对象直接构造到 函数的返回值

在我的示例中,返回表达式不是一个名称,所以我认为不允许使用省略。

我已经检查了GCC/clang/MSVC,虽然clang/MSVC没有复制,但GCC有。海湾合作委员会是否违反了这里的标准?

首先,"as-if"规则在这里不适用,因为复制和移动构造函数有副作用(它们执行 IO(。 因此,GCC 不能省略该标题下的副本/移动。

一目了然,我看不到任何其他允许省略的措辞,所以我认为这是 GCC 中的一个错误。 另一方面,我非常希望标准能够扩大复制/移动省略的范围以包括这种情况。 (在您提供的最小示例中,我看不出它如何导致问题 - 我假设您有一个大示例。