标签: nullptr

什么是nullptr?

我们现在拥有许多新功能的C++ 11.一个有趣且令人困惑的(至少对我来说)是新的nullptr.

嗯,不再需要令人讨厌的宏了NULL.

int* x = nullptr;
myclass* obj = nullptr;
Run Code Online (Sandbox Code Playgroud)

尽管如此,我还没有得到如何nullptr运作.例如,维基百科的文章说:

C++ 11通过引入一个new 关键字作为一个区分空指针常量来解决这个问题:nullptr.它的类型为nullptr_t,它是可隐式转换的,可与任何指针类型或指向成员类型的类型相媲美.除了bool之外,它不可隐式转换或与整数类型相比.

它是一个关键字和一个类型的实例?

另外,你有另一个例子(在维基百科旁边)哪里nullptr优于好老0

c++ pointers nullptr c++11

546
推荐指数
8
解决办法
31万
查看次数

NULL vs nullptr(为什么它被替换?)

我知道在C++中0x或者NULLnullptr基于指针的应用程序所取代.我只是好奇他们为什么要更换它?

在处理指针时,在什么情况下使用nullptr过度NULL有益?

c++ null pointers nullptr

176
推荐指数
4
解决办法
14万
查看次数

使用nullptr有什么好处?

这段代码在概念上对三个指针(安全指针初始化)做了同样的事情:

int* p1 = nullptr;
int* p2 = NULL;
int* p3 = 0;
Run Code Online (Sandbox Code Playgroud)

所以,什么是分配球的优势,nullptr在赋予它们的值NULL0

c++ null c++-faq nullptr c++11

158
推荐指数
4
解决办法
5万
查看次数

C++ 11清除shared_ptr时,我应该使用reset还是设置为nullptr?

我有一个关于C++ 11最佳实践的问题.清除shared_ptr时,我应该使用reset()没有参数的函数,还是应该设置shared_ptrnullptr?例如:

std::shared_ptr<std::string> foo(new std::string("foo"));
foo.reset();
foo = nullptr;
Run Code Online (Sandbox Code Playgroud)

是否存在任何真正的差异,或者两种方法都存在优势/劣势?

c++ reset shared-ptr nullptr c++11

58
推荐指数
2
解决办法
6万
查看次数

可以在gcc中模拟nullptr吗?

我看到它nullptr是在Visual Studio 2010中实现的.我喜欢这个概念,并希望尽快开始使用它; 但是GCC还不支持它.我的代码需要在两者上运行(但不必与其他编译器一起编译).

有没有办法"模仿"它?就像是:

#define nullptr NULL
Run Code Online (Sandbox Code Playgroud)

(这显然不会很好,只是为了表明我的意思.)

c++ gcc nullptr c++11

47
推荐指数
4
解决办法
2万
查看次数

#define NULL nullptr是否安全?

我在许多最顶层的头文件中看到了下面的宏:

#define NULL 0  // C++03
Run Code Online (Sandbox Code Playgroud)

在各地的代码,NULL并且0可以互换使用.如果我改成它.

#define NULL nullptr  // C++11
Run Code Online (Sandbox Code Playgroud)

它会导致任何不良副作用吗?我可以想到唯一的(好的)副作用,因为以下用法会变得格格不入;

int i = NULL;
Run Code Online (Sandbox Code Playgroud)

c++ null nullptr c++11

42
推荐指数
3
解决办法
6365
查看次数

为什么不能取nullptr的地址?

在C++ 11标准,为什么服用nullptr是不允许的,而一个地址,我不明白其中的道理允许携带自己的std :: nullptr_t实例的地址.除了nullptr是保留关键字这一事实之外,是否有任何指定的推理作出此决定?

仅仅因为它让我很开心,我试图用以下函数环绕这个限制:

decltype(nullptr)* func(const decltype(nullptr) &nref) noexcept
{
    return const_cast<decltype(nullptr)*>(reinterpret_cast<const decltype(nullptr)*>(&nref));
}
Run Code Online (Sandbox Code Playgroud)

我不得不在参数上使用reinterpret_cast,因为没有它我得到了歇斯底里的错误:

error: invalid conversion from 'std::nullptr_t*' to 'std::nullptr_t*' [-fpermissive]
Run Code Online (Sandbox Code Playgroud)

当我通过直接传递nullptr来调用此函数时,每次都会得到一个不同的地址.是否为nullptr动态分配地址及时进行比较等?或者(可能更有可能)编译器可能强制执行底层对象的临时副本?

当然,这些都不是至关重要的信息,我只是觉得有趣的是为什么要实施这一特定的限制(以及随后为什么我会看到我的行为).

c++ std nullptr c++11

41
推荐指数
3
解决办法
3840
查看次数

NULL宏实际上可以是nullptr吗?

根据标准N4713(7.11/1)的草案:

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

和21.2.3/2:

NULL是一个实现定义的空指针常量.

以下NULL可以定义为nullptr.cppreference上提到了相同的内容:

#define NULL 0
//since C++11
#define NULL nullptr
Run Code Online (Sandbox Code Playgroud)

同时"Additive operators"条款说(8.5.6/7):

如果将值0添加到空指针值或从空指针值中减去该值,则结果为空指针值.如果减去两个空指针值,则结果将等于0转换为该类型的值std::ptrdiff_t.

因此,以下代码应该是有效的:

0 + nullptr; 
nullptr - nullptr; 
Run Code Online (Sandbox Code Playgroud)

但由于缺乏+/-运营商对于std::nullptr_t代码是无效的.

有没有我没有考虑到的东西或NULL宏不能实际定义为nullptr

c++ null nullptr language-lawyer

41
推荐指数
4
解决办法
3207
查看次数

C++ 11中的纯虚函数

在C++ 98中,空指针由文字表示0(或实际上是值为零的任何常量表达式).在C++ 11中,我们更喜欢nullptr.但这对纯虚函数不起作用:

struct X
{
    virtual void foo() = nullptr;
};
Run Code Online (Sandbox Code Playgroud)

为什么这不起作用?这不是很有意义吗?这只是一个疏忽吗?它会被修复吗?

c++ virtual pure-virtual nullptr c++11

35
推荐指数
6
解决办法
1万
查看次数

为什么'std'命名空间中没有'nullptr'?

它似乎nullptr是在默认的全局命名空间中声明的.它在std命名空间中是否有意义?

c++ nullptr c++11

31
推荐指数
2
解决办法
2675
查看次数

标签 统计

c++ ×10

nullptr ×10

c++11 ×8

null ×4

pointers ×2

c++-faq ×1

gcc ×1

language-lawyer ×1

pure-virtual ×1

reset ×1

shared-ptr ×1

std ×1

virtual ×1