воскресенье, 26 февраля 2012 г.

Про локальные переменные. Выпуск #2.

























Досье: 




Кстати, об 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 комментарий:

dreary Snork комментирует...

Думаю, что подобное поведение имплементировано вполне сознательно, для сохранения, так сказать, родственных черт с указателями вообще. Хотя и странно - зачем?