C++ 有效C++;斯科特·迈尔斯,第二版? const//它是一个const对象。。。 类nullptr\t { 公众: 模板 内联运算符T*()常量//可转换为任何类型的空非成员指针。。。 {返回0;} 模板 内联运算符tc::*()常量//或任何类型的空成员指针。。。 {返回0;} 私人: void运算符(&()const;//无法获取nullptr的地址 }nullptr={}; 类中已经定义了运算符T*()常量和运算符T C::*()常量,因此它可以自动内联。那么,为什么要再次添加inline 为什么void操作符&()常量,而不是无效运算符(&()=delete 什么是nullptr={}平均值

C++ 有效C++;斯科特·迈尔斯,第二版? const//它是一个const对象。。。 类nullptr\t { 公众: 模板 内联运算符T*()常量//可转换为任何类型的空非成员指针。。。 {返回0;} 模板 内联运算符tc::*()常量//或任何类型的空成员指针。。。 {返回0;} 私人: void运算符(&()const;//无法获取nullptr的地址 }nullptr={}; 类中已经定义了运算符T*()常量和运算符T C::*()常量,因此它可以自动内联。那么,为什么要再次添加inline 为什么void操作符&()常量,而不是无效运算符(&()=delete 什么是nullptr={}平均值,c++,C++,添加额外的内联是一个风格问题。该说明符与链接和ODR冲突有关,而不是实际的内联。通常,所有内联成员函数定义和模板成员函数都隐式地具有该说明符。我想斯科特·迈尔斯(Scott Meyers)是出于教学方面的原因在这里添加的 > C++最初是用C++编写的。当时没有=delete。声明但不定义函数是您当时所能做的一切 这是聚合初始化。即使在C++03中,nullptr\t的这个实现也可以像这样初始化。它创建nullptr的值。由于nullptr\u t没有用户提供的默认任务,因此它是必需的 是否需

添加额外的内联是一个风格问题。该说明符与链接和ODR冲突有关,而不是实际的内联。通常,所有内联成员函数定义和模板成员函数都隐式地具有该说明符。我想斯科特·迈尔斯(Scott Meyers)是出于教学方面的原因在这里添加的

<> > C++最初是用C++编写的。当时没有
=delete
。声明但不定义函数是您当时所能做的一切

  • 这是聚合初始化。即使在C++03中,
    nullptr\t
    的这个实现也可以像这样初始化。它创建
    nullptr
    的值。由于
    nullptr\u t
    没有用户提供的默认任务,因此它是必需的


  • 是否需要进行聚合初始化
    nullptr\u t
    根本没有任何状态/变量,因此没有要初始化的内容,没有?@Raket1111-变量是
    const
    (隐藏在第1行),因此它必须有一个初始值设定项。@Boperson-你是对的。我完全忘记了丢失的用户定义的c'tor。@BoPersson你能解释一下为什么
    变量是常量(隐藏在第1行),所以它必须有一个初始值设定项意味着什么?我也不熟悉这个概念,谢谢@czxyl-声明的
    nullptr
    是一个常量(将
    const
    关键字置于有效但不寻常的位置)。由于以后无法为常数赋值,因此定义常数时必须始终为其赋值。该类没有成员变量,因此其值看起来为空-
    ={}
    .1。有些编译器,如MSVC,有一个选项“仅内联函数标记为
    inline
    ”。在调试模式下可能有用。如果您有
    =delete,您可能有
    nullptr
    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 = {};