Позвольте мне задать свой вопрос на примере.
#include <memory>
std::unique_ptr<int> get_it() {
auto p = new int;
return p;
}
int main() {
auto up ( get_it() );
return 0;
}
Это не скомпилируется со следующей ошибкой:
a.cpp:5:9: error: could not convert ‘p’ from ‘int*’ to ‘std::unique_ptr<int>’
return p;
^
Почему здесь нет автоматического преобразования необработанного указателя в уникальный? И что я должен делать вместо этого?
Мотивация: я понимаю, что использование интеллектуальных указателей для ясности владения должно быть хорошей практикой; Я получаю указатель (который у меня есть) откуда-то, как int*
в данном случае, и я (думаю, что я) хочу, чтобы он был в unique_ptr
.
Если вы планируете прокомментировать или добавить свой собственный ответ, обратитесь по адресу аргументы Герберта Саттера в пользу того, что это возможно в предложении N4029.
int x; return &x;
, будут компилироваться. - person Kerrek SB   schedule 19.01.2016int *p = nullptr; *p = 123;
, и это скомпилируется. Впрочем, чтобы не слишком спорить - спрошу - что же мне делать-то? - person einpoklum   schedule 19.01.2016std::unique_ptr<int>(p)
. - person Vincent Savard   schedule 19.01.2016std::unique_ptr<int>
? - person einpoklum   schedule 19.01.2016p
, который имеет типint*
, а неstd::unique_ptr<int>
. Возможно, вы не понимаете, что делаетauto
. - person Vincent Savard   schedule 19.01.2016return std::make_unique<int>();
std::make_unique
- person Joe   schedule 19.01.2016std::unique_ptr<int>
, я могу вернуть только его. Я имею в виду, что int * должен быть приведен. Точно так же, как если бы я вернул 3,5 в функции, возвращающей int. - person einpoklum   schedule 19.01.2016int* p
(волшебным образом, который я не упомянул в MWE). - person einpoklum   schedule 19.01.2016p
не приводится неявно кstd::unique_ptr
? - person Vincent Savard   schedule 19.01.2016int foo() { return 3.5; }
и должен был бы сделатьint foo() { return (int)3.5;}
, но мне это не нужно. - person einpoklum   schedule 19.01.2016double
вint
. Вы смешиваете разные понятия. - person Vincent Savard   schedule 19.01.2016p
не может быть разыменован, что является вашей ошибкой. Мой&x
является вполне допустимым указателем int. - person Kerrek SB   schedule 19.01.2016