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

4

问题来源:

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

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

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

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


3
这可能只是归结为“这很有用”,但我会继续关注并看看会出现什么。 - user4581301
不,它们是两个不同的问题。你可以选择将一个const引用绑定到一个临时对象,但没有生命周期延长 - 这仍然允许以这种方式传递参数给函数。 - SergeyA
@SergeyA 如果它的生命周期没有延长,那么就不可能绑定任何东西,那你怎么能传递已经过期的内容呢? - Bob
1
为什么引用无法捕获临时变量? - Bo Persson
2
如果你调用Drawline(Vector{}, Vector{});,那么没有生命周期延长。这两个临时Vector的生命周期在完整表达式结束时结束,因此您可以在函数中使用它们。另一方面,如果您编写auto const& v = Vector{};,则临时对象的生命周期将被延长以匹配v的生命周期。那么你是问其中哪一个呢? - Praetorian
显示剩余3条评论
1个回答

6
如果对象是临时的,为什么将引用声明为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中得知:

-- 否则,该引用必须是对非易失的const类型的左值引用(即,cv1必须为const),或者该引用必须是一个右值引用。

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

MS Visual Studio编译器允许将非const引用绑定到临时对象,但标准不支持此行为。


@MarcGlisse,这个怎么样? - R Sahu
MSVC 允许在最长时间内绑定到非 const 引用,这意味着这是一个明确的设计选择。声称修改是否应该被允许需要一些理由支持。 - Passer By
@PasserBy,已更新答案以解决您的问题。 - R Sahu

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接