首页
学习
活动
专区
工具
TVP
发布
社区首页 >问答首页 >生命周期扩展与条件算子

生命周期扩展与条件算子
EN

Stack Overflow用户
提问于 2013-01-19 03:06:01
回答 2查看 729关注 0票数 20

局部左值引用到常量引用和右值引用可以延长临时对象的生命周期:

代码语言:javascript
复制
const std::string& a = std::string("hello");
std::string&& b = std::string("world");

当初始化器不是一个简单的表达式,而是使用条件运算符时,这也有效吗?

代码语言:javascript
复制
std::string&& c = condition ? std::string("hello") : std::string("world");

如果其中一个结果是临时对象,而另一个不是,该怎么办?

代码语言:javascript
复制
std::string d = "hello";
const std::string& e = condition ? d : std::string("world");

当条件为假时,C++是否强制延长临时对象的生命周期?

这个问题是在回答this question关于不可复制对象的问题时出现的。

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2013-01-19 03:26:46

这两个都很好。

§5.16表示(异常简略):

如果第二个或第三个操作数的类型为空,则为

2

不是的。

如果第二个和第三个操作数具有不同的ff类型,则返回

3

不是的。

如果第二个和第三个操作数是同一值类别的GL值,则为

4

不是的。(在第一个中,两个都是prvalue,第二个是glvalue,一个是prvalue。)

5否则,结果为prvalue

好的,所以这两个结果都是prvalue。所以绑定是好的,但是绑定到什么呢?

在第二个和第三个操作数上执行

6 L值到右值(4.1)、数组到指针(4.2)和函数到指针(4.3)的标准转换。

好的,如果它们不是rvalue,那么它们现在都是rvalue。

6(续)在这些转换之后,应满足以下条件之一:第二个和第三个操作数具有相同的类型;结果为该类型。如果操作数具有类类型,则结果是结果类型的prvalue temporary,它是从第二个操作数或第三个操作数复制初始化的,具体取决于fi第一个操作数的值。

好吧,不是std::string(first_operand)就是std::string(second_operand)

无论如何,条件表达式的结果是一个新的prvalue临时值,它是通过绑定到引用来扩展的值。

票数 5
EN

Stack Overflow用户

发布于 2013-01-19 03:16:42

代码语言:javascript
复制
std::string d = "hello";
const std::string& e = condition ? d : std::string("world");

当条件为false时,C++是否强制延长临时对象的生命周期?

它会是的。条件是一个右值表达式,当与const引用绑定时,编译器将创建一个未命名的对象并将引用绑定到该对象。我不能百分之百确定的是,生命周期延长的临时器是否是std::string("world"),或者(从概念上)是否制作了它的副本(并将其省略)。

票数 3
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/14405837

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档