3

After releasing a std::shared_ptr<T>, when I do ptr.get() is the return value NULL or nullptr? In order to compare, I used this:

std::shared_ptr<int> ptr(new int(44));

ptr.reset();
int *p = ptr.get();

if (p == nullptr)
{
    cout << "nullptr";
}

if (p == NULL)
{
    cout << "NULL";
}

Both seem to be the result.

4

2 回答 2

12

在 C++11 中,使用nullptr.

在这种情况下,它们确实是正确且等效的,因为它们都是第 4.10/1 段指定的空指针常量NULL(通常是#defined 0):

空指针常量是整数类型的整数常量表达式 (5.19) 纯右值,其计算结果为零或类型的纯右值std::nullptr_t。空指针常量可以转换为指针类型;结果是该类型的空指针值,并且可以与对象指针或函数指针类型的所有其他值区分开来。

但是,nullptr类型系统将其识别为类型指针文字nullptr_t和特殊的空指针常量,因此您和编译器都清楚它的语义。NULL另一方面,它只是一个已知会扩展为零的宏。

于 2013-05-30T17:46:56.177 回答
2

2.14.7 指针文字 [lex.nullptr]

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

两者是等价的,但您应该更喜欢使用 nullptr。

于 2013-05-30T17:49:13.867 回答