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

pet*_*hen 16 c++ temporary

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

int x = foo(5);
Run Code Online (Sandbox Code Playgroud)

在分配给x之前,对临时的引用是否"存活"?

(我知道它在foo()调用的持续时间内存活,但是赋值让我犹豫)

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

T const & foo_cr(T  const & dflt);
T const & foo_v(T dflt);
Run Code Online (Sandbox Code Playgroud)

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

jpa*_*cek 14

在分配给x之前,对临时的引用是否"存活"?

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

C++ 03,12.2/3:

当实现引入具有非平凡构造函数(12.1)的类的临时对象时,它应确保为临时对象调用构造函数.类似地,应该使用非平凡的析构函数(12.4)调用析构函数.临时对象作为评估全表达式(1.9)的最后一步被销毁,该表达式(词法上)包含创建它们的点.即使该评估以抛出异常结束,也是如此.

更多的是12.2/4和12.2/5,尤其是此规则的例外情况.

我看不出当你把...你遗漏的时候会发生什么,但我想你不是在问这个问题.

  • 目前未指定"x"的商店是完整表达式的一部分.请参阅http://llvm.org/bugs/show_bug.cgi?id=9783,但委员会和(希望)用户都非常希望这样做.但独立于此,规范已经指定`foo`(lvalue-to-rvalue)返回的引用的*read*是完整表达式的一部分.请参见1.9p10及其尾随示例. (7认同)