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

陳 力*_*陳 力 12 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 = {};
Run Code Online (Sandbox Code Playgroud)
  1. operator T*() const并且operator T C::*() const已经在类中定义,因此它可以自动内联.那么,为什么inline要再添加?
  2. 为什么void operator&() const;,不是void operator&() = delete吗?
  3. 什么nullptr = {};意思?

Sto*_*ica 17

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

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

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

  • @ Rakete1111 - 变量是`const`(隐藏在第1行)所以它必须有一个初始化器. (5认同)
  • @czxyl - 声明的`nullptr`是一个常量(`const`关键字放在一个有效但不寻常的位置).由于以后无法为常量赋值,因此在定义时必须始终为常量赋值.该类没有成员变量,因此其值看起来是空的 - "= {}`. (3认同)