nullptr
От: Roman Odaisky Украина  
Дата: 28.08.06 11:35
Оценка:
Недавно наткнулся на проблему при заполнении последовательности указателей нулевыми значениями. std::fill сказал мне, что NULL ему не годится, поскольку int не приводится к типу X *. Тогда я решил, наконец, реализовать nullptr. Обратившись к коллективному сознанию, написал следующее:
class NullptrType: boost::noncopyable
{
public:
    template <class X>
    operator X* () const
    {
        return 0;
    }

    template <class T, class C>
    operator T C::* () const
    {
        return 0;
    }

    static NullptrType const& _the()
    {
        static NullptrType const the;
        return the;
    }

private:
    NullptrType()
    {
    }

    void operator &();
};

namespace
{
    NullptrType const& nullptr = NullptrType::_the();
}

Но тут же появились вопросы:
1. Зачем он noncopyable?
2. Зачем у него скрыт дефолтный конструктор?
(Какие варианты неправильного применения это помогает отловить? В C++09 nullptr ведь и копируется, и создается?)

3. (MSVC71) Как бы сделать, чтоб отладчик не заходил в эти операторы по F11? Может, есть какая-то прагма? А то F11 уже влезает в чересчур много мест: begin()/end(), iterator -> const_iterator, custom_cast, NullptrType -> X * и т. п., которые давно отлажены или, как в данном случае, не делают вообще ничего интересного;
4. Стоит ли #define NULL nullptr? В конце концов, программа вправе рассчитывать на #define NULL 0. Я сделал дефайн, что помогло выловить N-ное количество неуставных использований NULL и прояснить код, правильно расставив NULL и literal 0 — может, теперь дефайн следует убрать (и s/NULL/nullptr/g — ох и коммит будет )?
5. Есть вариант впихнуть туда член void* dummy, чтобы sizeof(nullptr) == sizeof(void *). Стоит ли?
До последнего не верил в пирамиду Лебедева.
 
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.