考虑以下代码:

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 != 0a会绑定(bind)到它,而不是绑定(bind)到其他一些MyClass吗?

  • 根据测试,对1的回答几乎可以肯定是"is"。 #2我不太确定,但是(复制省略等)...条件表达式似乎最终可能会从MyClass复制构造一个临时*aPtr,并延长该临时对象的生命周期。

    最佳答案

    您的条件表达式是prvalue(因为它的操作数之一是)。如果选择了条件运算符的第一个替代方法,它将被转换为一个临时变量(产生一个拷贝)。该临时对象绑定(bind)到该引用,并且通常的生命周期延长适用。

    相关标准[expr.cond]:

    09-25 22:19