20

local lvalue references-to-const 和 rvalue references 可以延长临时对象的生命周期:

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++ 是否要求延长临时的生命周期?

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

4

2 回答 2

5

这两个都很好。

§5.16 说(特别删节):

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

没有。

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

没有。

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

没有。(在第一个中,两个都是纯右值,在第二个中是一个左值,一个是纯右值。)

5 否则,结果为纯右值

好的,所以这两个结果都是纯右值。所以绑定很好,但是绑定到什么?

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

好的,如果它们还不是,那么它们现在都是右值。

6(续) 在这些转换之后,应满足以下条件之一:

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

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

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

于 2013-01-18T19:26:46.440 回答
3
std::string d = "hello";
const std::string& e = condition ? d : std::string("world");

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

这将是。条件是一个右值表达式,当与const引用绑定时,编译器将创建一个未命名的对象并将引用绑定到它。我不能 100% 确定的是,延长寿命的临时对象std::string("world")是否是(在概念上)制作(并被删除)的副本。

于 2013-01-18T19:16:41.757 回答