唯一的失败情况是通过非const引用传递参数,因为临时变量无法绑定到它上面。
void DrawLine(const Vector& v1, const Vector& v2);
如果对象是临时的,那么将引用声明为const
会对临时对象的生命周期产生任何影响吗?
我猜我也不完全理解在参数中创建的临时对象的存在范围。
唯一的失败情况是通过非const引用传递参数,因为临时变量无法绑定到它上面。
void DrawLine(const Vector& v1, const Vector& v2);
如果对象是临时的,那么将引用声明为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.
}
在各种情况下都会创建类类型的临时对象:将引用绑定到prvalue(参见[dcl.init.ref]),返回prvalue(参见[stmt.return]),创建prvalue的转换,...
并从C++11标准,引用/5.2中得知:
-- 否则,该引用必须是对非易失的const类型的左值引用(即,cv1必须为const),或者该引用必须是一个右值引用。
临时对象只能绑定到prvalue的引用上。这样引用的类型必须是const
限定的左值引用或右值引用。
MS Visual Studio编译器允许将非const
引用绑定到临时对象,但标准不支持此行为。
Drawline(Vector{}, Vector{});
,那么没有生命周期延长。这两个临时Vector
的生命周期在完整表达式结束时结束,因此您可以在函数中使用它们。另一方面,如果您编写auto const& v = Vector{};
,则临时对象的生命周期将被延长以匹配v
的生命周期。那么你是问其中哪一个呢? - Praetorian