按值返回时强制 RVO/移动构造

Forcing RVO / move construction when returning by value

本文关键字:移动 RVO 返回      更新时间:2023-10-16

假设我有一个对象'foo',其中包含一个复制构造函数和一个移动构造函数,以及一个函数

foo f() {
    foo bar;
    /* do some work */
    return bar;
}

该标准似乎声明编译器将尝试执行:NRVO,按 r 值返回 ref,按值返回,失败;按此顺序。

有没有办法强制编译器永远不会按值返回,因为我的复制构造函数非常昂贵?

编译器将尝试执行:NRVO,按 r 值引用返回,按值返回,失败;按该顺序。

上面的措辞不准确,可能表明你这边有误解。编译器可以使用 NRVO(大多数会),如果不可用,它将始终按值返回,区别在于返回值的构造方式。如果您的类型具有移动构造函数,则编译器必须使用该构造函数,并且只有在您的类型没有移动构造函数时才会使用复制构造函数。

也就是说,如果您的类型具有移动构造函数,则使用该复制构造函数的编译器将不符合 C++11。

如果代码

具有有效的移动构造函数,则foo永远不会通过复制返回。

您也可以使用 out-参数而不是返回:

void f(foo& bar) { ... }

但实际上,所有编译器都会做NVRO。