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