我正在阅读有关 NRVO 的信息,并试图了解什么时候应该依赖它,什么时候不应该依赖它。现在我有一个问题:为什么要完全依赖 NRVO?总是可以通过引用显式传递返回参数,那么有什么理由改用 NRVO 吗?
最佳答案
处理返回值比处理通过写入引用参数返回的方法简单得多。考虑以下两种方法
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);
关于c++ - 为什么要依赖命名返回值优化?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/18237632/