考虑以下代码:
int foo(MyClass const* aPtr = 0) {
MyClass const& a = aPtr ? *aPtr : MyClass(); // Either bind to *aPtr, or to a default-constructed MyClass
...
return a.bar();
}
希望在这里使用"most important const"。目的是允许传入一个空的
aPtr
(顺便说一句,是的,它必须是一个指针参数),在这种情况下,将临时构造一个MyClass
临时对象,并通过与该对象绑定(bind)的const引用延长其生命周期。 。而如果aPtr
不为null,则引用将绑定(bind)到其指向的对象,而不会发生任何(昂贵的)复制构造。问题二是:
aPtr == 0
,那么在函数结束之前,a
是否可以保证引用有效的MyClass
对象? aPtr != 0
,a
会绑定(bind)到它,而不是绑定(bind)到其他一些MyClass
吗? 根据测试,对1的回答几乎可以肯定是"is"。 #2我不太确定,但是(复制省略等)...条件表达式似乎最终可能会从
MyClass
复制构造一个临时*aPtr
,并延长该临时对象的生命周期。 最佳答案
您的条件表达式是prvalue(因为它的操作数之一是)。如果选择了条件运算符的第一个替代方法,它将被转换为一个临时变量(产生一个拷贝)。该临时对象绑定(bind)到该引用,并且通常的生命周期延长适用。
相关标准[expr.cond]: