Рассмотрим следующий код:
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 и продление срока действия этого временного.