这个临时参考是否足够存活?

时间:2012-02-06 12:25:25

标签: c++ temporary

template <typename T>
T const & foo(T const & dflt) 
  { return /* ... */ ? /* ... */ : dflt; }

int x = foo(5);

对临时的引用是否“存活”,直到它被分配给x?

(我知道它在foo()调用的持续时间内存活,但是这项任务让我犹豫不决)

有问题的代码在这里依赖于const引用有一些合法用途,即我需要两个单独的函数

T const & foo_cr(T  const & dflt);
T const & foo_v(T dflt);

我想避免(只是依赖于同名的不同签名对我来说似乎有点危险。)

1 个答案:

答案 0 :(得分:14)

  

对临时的引用是否“存活”,直到它被分配给x?

一般来说,是的。如果foo返回dflt,则该引用(到临时5)有效,直到创建它的完整表达式结束,这意味着,直到初始化之后。

C ++ 03,12.2 / 3:

  

当实现引入类的临时对象时   有一个非平凡的构造函数(12.1),它应该确保一个   为临时对象调用构造函数。同样,   析构函数应该被称为临时的非平凡的   析构函数(12.4)。临时对象作为最后一步被销毁   评估(词法上)包含的全表达式(1.9)   他们被创造的地方。即使进行评估也是如此   以抛出异常而告终。

12.2 / 4和12.2 / 5中有更多内容,尤其是此规则的例外情况。

我看不到当你遗漏的...时会发生什么,但我猜你没有问过这个问题。