Возвращает полезную нагрузку auto_ptr по значению в C ++ из функции - PullRequest
0 голосов
/ 19 февраля 2012

Гарантирует ли стандарт C ++, что здесь не будет сбоев при возврате полезной нагрузки auto_ptr по значению из функции:

class Foo { ... };

std::auto_ptr<Foo> createFoo() { 
  return std::auto_ptr<Foo>(new Foo(...));
}
...
Foo getFoo() {
  std::auto_ptr<Foo> foo(createFoo());
  return *foo; /// would be here a crash?
}

/// main
const Foo& foo(getFoo());

Что здесь происходит в соответствии со стандартом: *foo копируется, затем foo уничтожается и, наконец, выполняется return? Или есть другой порядок шагов?

Я протестировал этот пример с GCC, и не было сбоев, но я не уверен, что он будет работать с другими компиляторами.

Ответы [ 2 ]

2 голосов
/ 19 февраля 2012

Когда getFoo возвращается по значению, он создает (еще одну) копию объекта Foo.После этого не имеет значения, что исходный объект удаляется с помощью auto_ptr.

Довольно странного кода, хотя, чтобы использовать auto_ptr, а затем в любом случае создать копию.

1 голос
/ 19 февраля 2012

Это очень странный код, но, да - это гарантировано.Здесь нет RVO или семантики перемещения, поэтому все должно быть в порядке.

...