为什么临时对象可以绑定到常量引用?

why can temporary objects be bound to const reference?

本文关键字:常量 引用 绑定 临时对象 为什么      更新时间:2023-10-16

问题来源:

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

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

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

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

如果对象是临时的,为什么引用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 标准、临时对象/1

类类型的临时变量是在各种上下文中创建的:绑定对 prvalue 的引用 ([dcl.init.ref])、返回 prvalue ([stmt.return])、创建 prvalue 的转换......

以及来自 C++11 标准,参考/5.2:

-- 否则,参考应是非易失性常量类型的左值参考(即,cv1 应为常量),或者参考应为右值参考。

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

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