局部左值引用到常量引用和右值引用可以延长临时对象的生命周期:
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关于不可复制对象的问题时出现的。
发布于 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临时值,它是通过绑定到引用来扩展的值。
发布于 2013-01-19 03:16:42
std::string d = "hello";
const std::string& e = condition ? d : std::string("world");
当条件为false时,C++是否强制延长临时对象的生命周期?
它会是的。条件是一个右值表达式,当与const
引用绑定时,编译器将创建一个未命名的对象并将引用绑定到该对象。我不能百分之百确定的是,生命周期延长的临时器是否是std::string("world")
,或者(从概念上)是否制作了它的副本(并将其省略)。
https://stackoverflow.com/questions/14405837
复制相似问题