我正在阅读 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);