有关在Effective C ++中实现nullptr的一些问题,Scott Meyers,第二版?

时间:2017-09-09 09:09:18

标签: c++

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 = {};
  1. operator T*() constoperator T C::*() const已在类中定义,因此可以自动内联。那么,为什么要再次添加inline呢?
  2. 为什么void operator&() const;,而不是void operator&() = delete
  3. nullptr = {};是什么意思?

1 个答案:

答案 0 :(得分:17)

  1. 添加额外的内联是一种风格问题。该说明符与链接和ODR违规有关,而不是实际内联。所有内联成员函数定义和模板成员函数通常都具有该指定符隐式。我认为Scott Meyers是出于教学原因而在那里添加的。

  2. 有效的C ++最初是为C ++ 03编写的。当时没有= delete。当时你可以做的就是声明但没有定义一个函数。

  3. 这是聚合初始化。即使在C ++ 03中,nullptr_t的这种实现也可以初始化。它创建了nullptr的值。由于nullptr_t没有用户提供的默认c'tor,因此需要。