在
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);
我想避免(只是依赖于同名的不同签名对我来说似乎有点危险。)
答案 0 :(得分:14)
对临时的引用是否“存活”,直到它被分配给x?
一般来说,是的。如果foo
返回dflt
,则该引用(到临时5)有效,直到创建它的完整表达式结束,这意味着,直到初始化之后。
C ++ 03,12.2 / 3:
当实现引入类的临时对象时 有一个非平凡的构造函数(12.1),它应该确保一个 为临时对象调用构造函数。同样, 析构函数应该被称为临时的非平凡的 析构函数(12.4)。临时对象作为最后一步被销毁 评估(词法上)包含的全表达式(1.9) 他们被创造的地方。即使进行评估也是如此 以抛出异常而告终。
12.2 / 4和12.2 / 5中有更多内容,尤其是此规则的例外情况。
我看不到当你遗漏的...
时会发生什么,但我猜你没有问过这个问题。