Досье:
Кстати, об explicit. Никогда не создавайте boost::scoped_ptr вот так:
boost::scoped_ptr<A> ptr(); // Вы думаете, что это вызовет
// конструктор по умолчанию?
// Страшным голосом: "ХА-ХА-ХА"!
Нет, к сожалению, этот ptr - это даже не scoped_ptr. Вы не поверите, но это объявление ФУНКЦИИ без аргументов, которая возвращает scoped_ptr. А Вам слабо? :)
Почему? Потому что конструктор scoped_ptr объявлен как explicit:
explicit scoped_ptr( T * p = 0 ): px( p ) // never throws
{
#if defined(BOOST_SP_ENABLE_DEBUG_HOOKS)
boost::sp_scalar_constructor_hook( px );
#endif
},
что значит явный, без преобразования типов. И должен быть инициализирован хотя бы нулем (указателем, равным нулю). В тоже время в C++ всё, что может быть интерпретировано как функция, будет интерпретировано, как функция. Поэтому компилятор и думает, что это объявление функции. Но мы-то хотели не этого! Поэтому надо так:
boost::scoped_ptr<A> ptr(0); // так
boost::scoped_ptr<A> ptr; // или так
1 комментарий:
Думаю, что подобное поведение имплементировано вполне сознательно, для сохранения, так сказать, родственных черт с указателями вообще. Хотя и странно - зачем?
Отправить комментарий