Вчера я установил clang 3.1 и g ++ 4.7 и попытался скомпилировать проект, над которым я работаю. Я был удивлен, увидев, что он не компилируется с использованием обоих компиляторов. Но меня больше всего удивляет то, что проблема в boost::shared_ptr
.Ошибка при создании сборки boost :: shared_ptr с использованием C++ 11
По-видимому, поскольку этот класс определяет оператор-конструктор перемещения/присваивания, конструктор копирования неявно удаляется. Таким образом, этот код:
#include <boost/shared_ptr.hpp>
int main() {
boost::shared_ptr<int> x;
boost::shared_ptr<int> y(x);
}
Не компилируется. лязг повторяет эту ошибку:
test.cpp:5:28: error: call to implicitly-deleted copy constructor of
'boost::shared_ptr<int>'
boost::shared_ptr<int> y(x);
^~
/usr/include/boost/smart_ptr/shared_ptr.hpp:347:5: note: copy constructor is
implicitly deleted because 'shared_ptr<int>' has a user-declared move
constructor
shared_ptr(shared_ptr && r): px(r.px), pn() // never throws
^
г ++ 4.7 обеспечивает подобную ошибку, ссылаясь на неявно удаляемого конструктор, а также. Странно то, что boost::shared_ptr
, на самом деле явно определяет конструктор копирования (повышение/smart_ptr/shared_ptr.hpp линия 228):
template<class Y>
#if !defined(BOOST_SP_NO_SP_CONVERTIBLE)
shared_ptr(shared_ptr<Y> const & r, typename boost::detail::sp_enable_if_convertible<Y,T>::type = boost::detail::sp_empty())
#else
shared_ptr(shared_ptr<Y> const & r)
#endif
: px(r.px), pn(r.pn) // never throws
{
}
Я использую импульс 1.48.0.2, который является довольно новым. Кто-нибудь знает, что здесь происходит? Почему конструктор копирования не обнаруживается, когда он определен? Является ли это исправлено в новых версиях библиотеки интеллектуальных указателей? Я ничего не мог найти в списках изменений.
Boost 1.48 не является новым, его 8 месяцев (1.50 является текущим), и поскольку он был выпущен, исправлены _many_ C++ 11 исправления. Я бы сказал, что шаг 1 проверяет, что это работает в более новой версии Boost (или просто используйте 'std :: shared_ptr' вместо этого). – ildjarn
@Gigi такой же проблема. ildjarn Да, 8 месяцев для меня довольно нова. Дело в том, что я не понимаю, почему, черт возьми, он не работает, поскольку конструктор копирования фактически определен. Во всяком случае, мне, вероятно, придется обновлять свои библиотеки boost. – mfontanini
@mfontanini: 8 месяцев довольно старый в терминах Boost, особенно в терминах поддержки компилятора с кровотечением. : -] – ildjarn