我正在阅读 NRVO 并试图了解何时应该依赖它,何时不依赖它。现在我有一个问题:为什么要完全依赖 NRVO?总是可以通过引用显式传递返回参数,那么是否有任何理由依赖 NRVO 呢?

最佳答案

处理返回值比处理通过写入引用参数返回的方法更容易。考虑以下2种方法

C GetByRet() { ... }
void GetByParam(C& returnValue) { ... }

第一个问题是无法链接方法调用
Method(GetByRet());
// vs.
C temp;
GetByParam(temp);
Method(temp);

它还使 auto 等功能无法使用。对于像 C 这样的类型来说问题不大,但对于像 std::map<std::string, std::list<std::string>*> 这样的类型来说更重要
auto ret = GetByRet();
// vs.
auto value; // Error!
GetByParam(value);

同样正如 GMacNickG 指出的那样,如果 C 类型有一个普通代码不能使用的私有(private)构造函数怎么办?也许构造函数是 private 或者只是没有默认构造函数。 GetByRet 再次像冠军一样工作而 GetByParam 失败
C ret = GetByRet();  // Score!
// vs.
C temp; // Error! Can't access the constructor
GetByParam(temp);

10-06 01:56