终身扩展和条件运算符

时间:2013-01-18 19:06:01

标签: c++ c++11 rvalue-reference object-lifetime temporary-objects

本地左值引用-const和rvalue引用可以延长临时值的生命周期:

const std::string& a = std::string("hello");
std::string&& b = std::string("world");

当初始值设定项不是简单表达式,但是使用条件运算符?

时,这是否也有效?
std::string&& c = condition ? std::string("hello") : std::string("world");

如果其中一个结果是临时对象,但另一个结果不是?

,该怎么办?
std::string d = "hello";
const std::string& e = condition ? d : std::string("world");

当条件为假时,C ++是否要求延长临时的生命周期?

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

2 个答案:

答案 0 :(得分:5)

这两个都很好。

§5.16说(格外删节):

  

2如果第二个或第三个操作数的类型为void

不。

  

3否则,如果第二个和第三个操作数具有不同的类型

不。

  

4如果第二个和第三个操作数是相同值类别的glvalues

不。 (首先,两者都是prvalues,第二个是glvalue,一个是prvalue。)

  

5否则,结果是prvalue

好的,所以这两个都导致了prvalues。所以绑定很好,但是什么是绑定?

  

6 Lvalue-to-rvalue(4.1),array-to-pointer(4.2)和function-to-pointer(4.3)标准转换在第二个和第三个操作数上执行。

好的,如果它们还没有,那么它们现在都是rvalues。

  

6(续)经过这些转换后,下列之一将举行:

     

第二个和第三个操作数具有相同的类型;结果是那种类型。如果操作数具有类类型,则结果是结果类型的prvalue临时值,它根据第一个操作数的值从第二个操作数或第三个操作数进行复制初始化。

好的,所以它是std::string(first_operand)std::string(second_operand)

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

答案 1 :(得分:3)

std::string d = "hello";
const std::string& e = condition ? d : std::string("world");
  

当条件为假时,C ++是否要求延长临时的生命周期?

会的。条件是一个rvalue表达式,当与const引用绑定时,编译器将创建一个未命名的对象并绑定对它的引用。我不能100%确定的是,其生命周期延长的临时工具是std::string("world")还是(概念上)制作(并省略)的副本。