【问题标题】:why can temporary objects be bound to const reference?为什么临时对象可以绑定到 const 引用?
【发布时间】:2018-08-14 22:28:46
【问题描述】:

Source of question:

唯一失败的情况是通过非常量引用传递参数, 因为临时变量不能绑定到它。

void DrawLine(const Vector& v1, const Vector& v2);

如果对象是临时的,为什么引用 const 会对临时对象的生命周期产生任何影响?

我想我也没有完全理解在参数中创建的临时对象的存在范围。

【问题讨论】:

  • @MarcGlisse 一定是有原因的。我敢肯定他们不只是抛硬币。
  • 这可能只是解决为“它很有用”。但我会密切关注这一点,看看会出现什么。
  • 您的问题令人困惑。您是否在问为什么绑定到临时的 const 引用会延长它的生命周期(如在您的身体中)?还是您在问为什么可以将 const 引用绑定到临时对象并将其传递给以这种方式运行(正如您的标题和代码 sn-p 所暗示的那样)?请注意,在您的代码中没有生命周期延长。
  • 如果您致电Drawline(Vector{}, Vector{});,则不会延长生命周期。两个临时 Vectors 的生命周期都在完整表达式的末尾结束,因此您可以在函数中使用它们。另一方面,如果你写auto const& v = Vector{};,临时的生命周期会延长到与v 相匹配。那么您要问的是哪一个?

标签: c++ stack pass-by-reference


【解决方案1】:

如果对象是临时对象,为什么引用 const 会对临时对象的生命周期产生任何影响?

在目前的情况下,问题不是对象的生命周期,而是您是否可以修改它。

假设你正在打电话。

foo(10);

在调用中保存值10 的对象不应被函数修改。如果foo的接口是:

void foo(int& ref);

foo 实现为:

void foo(int& ref)
{
   ref = 20;
}

如果调用 foo(10),那将是一个问题。如果foo 使用const& 则不会有问题。

void foo(int const& ref)
{
   ref = 20; // Not allowed.
}

来自C++11 Standard, Temporary Objects/1

类类型的临时对象在各种上下文中创建:将引用绑定到纯右值 ([dcl.init.ref]),返回纯右值 ([stmt.return]),创建纯右值的转换,...​​

来自C++11 Standard, References/5.2

-- 否则,引用应为对非易失性 const 类型的左值引用(即 cv1 应为 const),或者引用应为右值引用。

临时只能绑定到对prvalue的引用。此类引用的类型必须是 const 限定的左值引用或右值引用。

MS Visual Studio 编译器允许将非const 引用绑定到临时对象,但标准并未批准。

【讨论】:

  • @MarcGlisse,怎么样?
  • MSVC 允许绑定到非常量引用的时间最长,这意味着它是一个明确的设计选择。声称是否应该允许修改需要一些理由
  • @PasserBy,更新了答案以解决您的问题。
猜你喜欢
  • 2019-07-02
  • 2021-09-09
  • 2016-11-09
  • 2012-07-18
  • 1970-01-01
  • 2022-01-01
相关资源
最近更新 更多