Lifetime extension and the conditional operator

情到浓时终转凉″ 提交于 2019-11-30 08:09:14

Both of those are fine.

§5.16 says (extraordinarily abridged):

2 If either the second or the third operand has type void

Nope.

3 Otherwise, if the second and third operand have different types

Nope.

4 If the second and third operands are glvalues of the same value category

Nope. (In the first, both are prvalues and in the second one is a glvalue and one is a prvalue.)

5 Otherwise, the result is a prvalue

Okay, so both of these result in prvalues. So the binding is fine, but what's the binding to?

6 Lvalue-to-rvalue (4.1), array-to-pointer (4.2), and function-to-pointer (4.3) standard conversions are per- formed on the second and third operands.

Okay, so both are now rvalues if they weren't already.

6 (continued) After those conversions, one of the following shall hold:

The second and third operands have the same type; the result is of that type. If the operands have class type, the result is a prvalue temporary of the result type, which is copy-initialized from either the second operand or the third operand depending on the value of the first operand.

Okay, so it's either std::string(first_operand) or std::string(second_operand).

Regardless, the result of the conditional expression is a new prvalue temporary, and it's that value that's extended by binding to your references.

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

Does C++ mandate the lifetime of the temporary be extended when the condition is false?

It will be. The conditional is an rvalue expression, and when bound with a const reference the compiler will create an unnamed object and bind the reference to it. What I am not 100% sure is whether the temporary whose lifetime is extended is std::string("world") or whether a copy of it is (conceptually) made (and elided).

易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!