5

阅读一些代码,我发现一个类只接受新的 C++11nullptr_t作为参数。该类如下所示。

我是否正确地认为我唯一可以通过使用来构造对象nullptr

class CA {
 public:
 CA(nullptr_t) {}  
};
4

3 回答 3

6

该标准在 §2.14.7.1 中规定:

指针文字是关键字nullptr。它是类型的prvalue std::nullptr_t。[注意:std::nullptr_t是一种独特的类型,既不是指针类型也不是指向成员类型的指针;相反,这种类型的纯右值是一个空指针常量,可以转换为空指针值或空成员指针值。——尾注]

type 的唯一纯右值nullptr_tnullptr可以按照 §4.10 和 §4.11 中指定的规则转换为其他指针类型。

std::nullptr_t根据 §4.10.1 ,其他整数文字可以转换为类型值:

空指针常量是一个整数文字 (2.14.2),其值为 0 或类型为 prvalue std::nullptr_t

因此,您可以使用值为零或的整数文字nullptr

具体来说:

  • 0
  • 0u,0U
  • 0l,0L
  • 0ul, 0uL, 0Ul,0UL
  • 0ll,0LL
  • 0ull, 0uLL,0ULL
  • nullptr
  • NULL

我可能会遗漏一些案例,所以请随时纠正我。

于 2014-11-25T08:04:45.193 回答
4

我是否正确地认为我唯一可以通过专门使用 nullptr 来构造对象?

不,这在 §4.10 [conv.ptr] 中有介绍:

整数类型的空指针常量可以转换为 prvalue 类型std::nullptr_t

其中空指针常量定义如下:

空指针常量是一个整数文字 (2.14.2),其值为 0 或类型为 prvalue std::nullptr_t

换句话说,您的构造函数也可以使用值为 0 的各种整数文字来调用:

CA{ 0 };
CA{ 0u };
CA{ 0LL };
CA{ 0x0 };
于 2014-11-25T08:11:15.533 回答
2

根据文档:

std::nullptr_t 是空指针字面量 nullptr 的类型。

这意味着是的,您只能使用nullptr或相应的整数值构造此对象(如下面解释的答案)。查看示例,因为它显示了您需要它的情况。

于 2014-11-25T08:02:31.393 回答