终身扩展和条件运算符

fre*_*low 20 c++ object-lifetime rvalue-reference temporary-objects c++11

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

const std::string& a = std::string("hello");
std::string&& b = std::string("world");
Run Code Online (Sandbox Code Playgroud)

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

std::string&& c = condition ? std::string("hello") : std::string("world");
Run Code Online (Sandbox Code Playgroud)

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

std::string d = "hello";
const std::string& e = condition ? d : std::string("world");
Run Code Online (Sandbox Code Playgroud)

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

回答有关不可复制对象的问题时出现了这个问题.

GMa*_*ckG 5

这两个都很好.

§5.16说(格外删节):

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

不.

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

不.

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

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

5否则,结果是prvalue

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

6在第二个和第三个操作数上执行左值到右值(4.1),数组到指针(4.2)和函数到指针(4.3)标准转换.

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

6(续)经过这些转换后,下列之一应成立:

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

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

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