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

时间:2018-03-06 23:00:37

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

Source of question:

  

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

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

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

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

1 个答案:

答案 0 :(得分:4)

  

如果对象是临时的,为什么使引用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

  

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

C++11 Standard, References/5.2

  

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

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

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