Каким должно быть поведение unique_ptr в этой ситуации? - PullRequest
4 голосов
/ 12 декабря 2011

Скажите, что у меня есть следующее:

std::unique_ptr<A> pA;
pA(new A);

В этом сложном примере, каким должно быть поведение pA(new A);?

Насколько я могу судить, в MSVC2010, void operator()(T*) const; из default_delete вызывается сразу после возврата new и удаления указателя сразу.В то время как g ++ (4.7.0) дал мне no match for call (std::unique_ptr<A>)(A*) ошибку.

Ответы [ 2 ]

6 голосов
/ 12 декабря 2011

Код не должен компилироваться. std::unique_ptr не перегружает operator().

Предварительный просмотр Visual C ++ 2011 Developer справедливо отклоняет код. Visual C ++ 2010 принимает код только из-за ошибки в его реализации std::unique_ptr .

1 голос
/ 12 декабря 2011

MSVC использует оптимизацию средства удаления без состояния для unique_ptr, то есть использует оптимизацию пустого базового класса и просто наследуется от средства удаления.К сожалению, наследование public, поэтому у вас есть доступ к перегруженному operator() функтора default_delete.

...