c++ - 为什么要依赖命名返回值优化?

标签 c++ nrvo

我正在阅读有关 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/

相关文章:

c++ - 如何将 16 位无符号整数转换为更大的 8 位无符号整数?

c++ - 如何对运算符返回值强制执行 RVO?

c++ - 编译器优化返回 (std::stringstream ss).str()

C++ 不命名类型

c++ - 如何避免程序中包含指向对象指针的动态数组的内存泄漏?

c++ - 不依赖鼠标的QTooltip

c++ - 从动态分配的数组中获取内存泄漏

c++ - 如何确保执行 RVO 而不是复制?

c++ - 编译器是否足够聪明以 std::move 变量超出范围?