我们现在拥有许多新功能的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++中0x或者NULL被nullptr基于指针的应用程序所取代.我只是好奇他们为什么要更换它?
在处理指针时,在什么情况下使用nullptr过度NULL有益?
这段代码在概念上对三个指针(安全指针初始化)做了同样的事情:
int* p1 = nullptr;
int* p2 = NULL;
int* p3 = 0;
Run Code Online (Sandbox Code Playgroud)
所以,什么是分配球的优势,nullptr在赋予它们的值NULL或0?
我有一个关于C++ 11最佳实践的问题.清除shared_ptr时,我应该使用reset()没有参数的函数,还是应该设置shared_ptr为nullptr?例如:
std::shared_ptr<std::string> foo(new std::string("foo"));
foo.reset();
foo = nullptr;
Run Code Online (Sandbox Code Playgroud)
是否存在任何真正的差异,或者两种方法都存在优势/劣势?
我看到它nullptr是在Visual Studio 2010中实现的.我喜欢这个概念,并希望尽快开始使用它; 但是GCC还不支持它.我的代码需要在两者上运行(但不必与其他编译器一起编译).
有没有办法"模仿"它?就像是:
#define nullptr NULL
Run Code Online (Sandbox Code Playgroud)
(这显然不会很好,只是为了表明我的意思.)
我在许多最顶层的头文件中看到了下面的宏:
#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++ 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动态分配地址及时进行比较等?或者(可能更有可能)编译器可能强制执行底层对象的临时副本?
当然,这些都不是至关重要的信息,我只是觉得有趣的是为什么要实施这一特定的限制(以及随后为什么我会看到我的行为).
根据标准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++ 98中,空指针由文字表示0(或实际上是值为零的任何常量表达式).在C++ 11中,我们更喜欢nullptr.但这对纯虚函数不起作用:
struct X
{
virtual void foo() = nullptr;
};
Run Code Online (Sandbox Code Playgroud)
为什么这不起作用?这不是很有意义吗?这只是一个疏忽吗?它会被修复吗?
它似乎nullptr是在默认的全局命名空间中声明的.它在std命名空间中是否有意义?