Некоторые вопросы о реализации nullptr в Effective С++ от Scott Meyers, Second Edition?

const // It is a const object...
class nullptr_t 
{
  public:
    template<class T>
    inline operator T*() const // convertible to any type of null non-member pointer...
    { return 0; }

    template<class C, class T>
    inline operator T C::*() const   // or any type of null member pointer...
    { return 0; }

  private:
    void operator&() const;  // Can't take address of nullptr

} nullptr = {};
  • operator T*() const и operator T C::*() const уже определены в классе, поэтому он может автоматически встраиваться. Итак, зачем добавлять inline снова?
  • почему void operator&() const;, а не void operator&() = delete?
  • что означает nullptr = {};?

Ответ 1

  • Добавление дополнительного встроенного текста - это вопрос стиля. Этот спецификатор связан с нарушениями связи и нарушениями ODR, а не с фактической вставкой. Все определения встроенных функций-членов и функции-члены шаблона в общем случае имеют неявный спецификатор. Я полагаю, что Скотт Майерс добавил его туда по педагогическим причинам.

  • Эффективный С++ был написан для С++ 03 изначально. Тогда не было = delete. Объявление, но не определение функции, это все, что вы могли бы сделать тогда.

  • Это агрегатная инициализация. Эта реализация nullptr_t может быть инициализирована так же, как и в С++ 03. Он создает значение nullptr. Поскольку nullptr_t не имеет предоставленного пользователем по умолчанию c'tor, требуется.