Рассмотрим следующий код:
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();
}
"самый важный const" , мы надеемся, используется здесь. Цель состоит в том, чтобы позволить пропускать null aPtr
(BTW, да, это должен быть аргумент указателя), и в этом случае временный объект MyClass
будет построен по умолчанию, а его время жизни расширено на const ссылка на него. Принимая во внимание, что если aPtr
не было null, ссылка привязывалась бы к его объекту с указателем без какой-либо (дорогой) конструкции копирования.
Два вопроса:
- Если
aPtr == 0
,a
гарантированно ссылается на действительный объектMyClass
до конца функции? - Если
aPtr != 0
, будетa
связываться с ним, а не с каким-либо другимMyClass
?
На основе тестирования ответ на 1 почти наверняка "да". # 2 Я не так уверен в том, что (копия elision и т.д.)... возможно, что условное выражение закончит копирование временного MyClass
из *aPtr
и продление срока действия этого временного.