C++ 这个临时引用是否存在足够长的时间?

C++ 这个临时引用是否存在足够长的时间?,c++,temporary,C++,Temporary,在 这是我想要避免的(仅仅依靠不同的签名和相同的名字对我来说似乎有点危险。) 对临时“生存”的引用在分配给x之前是否有效 一般来说,是的。如果foo返回dflt,则该引用(对临时5的引用)在创建它的完整表达式结束之前有效,也就是说,在初始化之后有效 C++03,12.2/3: 当实现引入类的临时对象时 有一个非平凡的构造函数(12.1),它应确保 为临时对象调用构造函数。同样地 应调用析构函数,以获得一个非平凡的 析构函数(12.4)。临时对象将作为中的最后一步被销毁 计算(词汇上)包含 创建它

这是我想要避免的(仅仅依靠不同的签名和相同的名字对我来说似乎有点危险。)

对临时“生存”的引用在分配给x之前是否有效

一般来说,是的。如果
foo
返回
dflt
,则该引用(对临时5的引用)在创建它的完整表达式结束之前有效,也就是说,在初始化之后有效

C++03,12.2/3:

当实现引入类的临时对象时 有一个非平凡的构造函数(12.1),它应确保 为临时对象调用构造函数。同样地 应调用析构函数,以获得一个非平凡的 析构函数(12.4)。临时对象将作为中的最后一步被销毁 计算(词汇上)包含 创建它们的位置。这是真实的,即使评估 以抛出异常结束

更多信息出现在12.2/4和12.2/5中,尤其是该规则的例外情况


我看不出当它返回您遗漏的
时会发生什么,但我猜您并没有问这个问题。

目前没有指定存储到“x”是完整表达式的一部分。不管委员会和(希望)用户多么强烈地希望看到。但是独立于此,规范已经指定读取
foo
(从左值到右值)返回的引用是完整表达式的一部分。请参阅1.9p10及其后续示例。感谢您的快速回答!是的,这个。。。case是安全的-我刚刚排除了它(引用作为附加参数通过引用传递的集合的元素)什么是
?:dflt这应该是什么意思?0\u o
在这个上下文中是“与问题无关的代码。我已将其更改为注释,也许这更清楚。
template <typename T>
T const & foo(T const & dflt) 
  { return /* ... */ ? /* ... */ : dflt; }

int x = foo(5);
T const & foo_cr(T  const & dflt);
T const & foo_v(T dflt);