Следующий код компилирует с лязгом 3.0/LibC++:СТД :: make_shared, СТД :: unique_ptr и перемещение Конструкторы
#include <memory>
class Foo
{
public:
Foo()
: mem_(new int(10))
{
}
std::unique_ptr<int> mem_;
};
int main()
{
auto foo = std::make_shared<Foo>();
return 0;
}
Но это не делает (добавлен std::string
параметра):
#include <memory>
#include <string>
class Foo
{
public:
Foo(const std::string& s)
: mem_(new int(10))
{
}
std::unique_ptr<int> mem_;
};
int main()
{
auto foo = std::make_shared<Foo>("aaa");
return 0;
}
Clang жалуется на использование удаленного конструктора. Для меня это не имеет смысла, поскольку std::make_shared
не должен копировать экземпляр Foo, единственное, что вызовет вызов конструктора (удаленной) копии std::unique_ptr
.
Но вот, как только я определяю конструктор перемещения явно, он компилируется.
#include <memory>
#include <string>
class Foo
{
public:
Foo(const std::string& s)
: mem_(new int(10))
{
}
Foo(Foo&& other)
: mem_(std::move(other.mem_))
{
}
std::unique_ptr<int> mem_;
};
int main()
{
auto foo = std::make_shared<Foo>("aaa");
return 0;
}
Теперь вопросы:
- Почему компилировать в первом примере, но не второй?
- Can
std::make_shared
копировать/перемещать объект при его создании? - Почему добавление конструктора перемещения устраняет проблему? Я не помню, что добавление конструктора не по умолчанию должно подавлять неявный конструктор перемещения.
EDIT: Проверено и все примеры, по всей видимости компилироваться с GCC 4.5.1 (через ideone.com), я подозреваю, что это случай ошибки Clang/LibC++, но вопросы 2 и 3 до сих пор стоят, плюс я хотел бы знать, какой компилятор более «правильный».
Я не думаю, что когда-либо неявный конструктор шаг при условии –
@parapura Rajkumar (1) удаление unique_ptr делает его уйти (даже не по умолчанию ctor), (2) неявный механизм перемещения по-прежнему определяется в соответствии с последней редакцией: http: //mmocny.wordpress.com/2010/12/09/implicit-move-wont-go/ –
@parapurarajkumar: действительно, я помню, что читал обсуждения, где неявные конструкторы перемещения были плохими, и их следует удалить из стандарта. Однако я не знаю конца истории. –