c++ - 为什么 const 引用会延长右值的生命周期?

标签 c++ standards

为什么 C++ 委员会决定 const 引用应该延长临时对象的生命周期?

这个事实已经在网上进行了广泛的讨论,包括在 stackoverflow 上。解释这种情况的权威资源可能是这个 GoTW:

GotW #88: A Candidate For the “Most Important const”

此语言功能的基本原理是什么?知道吗?

(替代方案是临时对象的生命周期不会被任何引用延长。)


我自己的基本理论是,这种行为允许对象隐藏实现细节。使用此规则,成员函数可以在返回值或对内部已经存在的值的 const 引用之间切换,而无需对客户端代码进行任何更改。例如,矩阵类可能能够返回行 vector 和列 vector 。为了最小化拷贝,可以根据实现(行主要与列主要)将其中一个或另一个作为引用返回。无论哪个不能通过引用返回,都必须通过复制并返回该值来返回(如果返回的 vector 是连续的)。库编写者可能希望在将来更改实现(行专业与列专业)并防止客户端编写强烈依赖于实现是行专业还是列专业的代码。通过要求客户端接受作为 const ref 的返回值,矩阵类可以返回 const refs 或值,而无需对客户端代码进行任何更改。无论如何,如果知道最初的理由,我想知道。

最佳答案

它是在 1993 年提出的。其目的是消除绑定(bind)到引用时对临时对象的不一致处理。

当时还没有 RVO(返回值优化)之类的东西,所以简单地禁止将临时对象绑定(bind)到引用会影响性能。

http://www.open-std.org/jtc1/sc22/wg21/docs/papers/1993/N0345.pdf

关于c++ - 为什么 const 引用会延长右值的生命周期?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/39718268/

相关文章:

c++ - 如何将 boost 数组表示为类型的指针?

c++ - 在函数调用中是否会发生左值到右值转换?

c# - 对于 C# 中的 NAND(不是两者都正确),哪种语法更有效?

unit-testing - 开放测试格式?

C++ 保存/加载双(到/从文件)

c++ - 当一个数组由子表达式创建时,其中的临时变量会发生什么?

http - 错误 403 的 HTTP 规范中的 "authorization will not help"是什么意思?

c++ - Qt 编译器标记顺序

c++ - 读取 .tsv 文件中的特定列

c++ - 通过 C++ 软件上的 C 接口(interface)传递/接收字符串