我有一个非常简单的问题......
我使用的是用C语言编写的SDL API.我正在使用C++.我的编译器支持关键字nullptr,我一直在阅读它.似乎使用而不是使用NULL宏更好.
当我调用SDL_SetVideoMode时,我假设它在失败时返回NULL,所以如果我这样做:
SDL_Surface *test = nullptr;
if ((test = SDL_SetVideoMode(params)) == nullptr)
{
// to-do code
}
Run Code Online (Sandbox Code Playgroud)
这会准确地检查我在表面测试中的优化是否成功?
标准状态,即nullptr类型std::nullptr_t(2.14.7)的指针文字.并且18.2p9定义nullptr_t了
namespace std {
typedef decltype(nullptr) nullptr_t;
}
Run Code Online (Sandbox Code Playgroud)
7.1.6.2p4 decltype(nullptr)是表达式的类型,nullptr根据定义std::nullptr_t(因为表达式nullptr是prvalue).将其代入nullptr_t结果的定义中
typedef nullptr_t nullptr_t
Run Code Online (Sandbox Code Playgroud)
另一方面,typedef说明符不引入新类型,它只是另一个现有类型的名称.那么,到底是什么nullptr_t?我无法理解这些定义.
以下是一个完美运行的代码示例:
#include<iostream>
#include<vector>
template< class D, template< class D, class A > class C, class A = std::allocator< D > >
void foo( C< D, A > *bar, C< D, A > *bas ) {
std::cout << "Ok!" << std::endl;
}
int main( ) {
std::vector< int > *sample1 = nullptr;
std::vector< int > *sample2 = nullptr;
foo( sample1, sample2 );
return( 0 );
}
Run Code Online (Sandbox Code Playgroud)
但是,在下面的代码中,编译器无法将std :: vector <int>*与nullptr匹配为第二个参数,甚至能够从第一个参数中扣除模板类型.
#include<iostream>
#include<vector>
template< class D, template< class D, class A > …Run Code Online (Sandbox Code Playgroud) 我已经编写 C++ 多年,nullptr用于空指针。我也知道 C,从那里 NULL 起源,并记住它是一个空指针的常量,类型void *。
出于NULL某些原因,我不得不在我的 C++ 代码中使用某些东西。好吧,想象一下当在一些模板参数推导过程中编译器告诉我我的 NULL 真的是一个......长时我的惊讶。所以,我仔细检查了:
#include <type_traits>
#include <cstddef>
static_assert(not std::is_same<decltype(NULL), long>::value, "NULL is long ???");
Run Code Online (Sandbox Code Playgroud)
事实上,静态断言失败(使用 GCC 和 clang)。
在cppreference.com 上检查,果然(C++11 措辞):
宏 NULL 是一个实现定义的空指针常量,它可以是一个值为 0 的整数文字,或者一个类型为 的纯右值
std::nullptr_t。
为什么这是有道理的?就其本身而言,鉴于 C 的不兼容性?
谁能告诉我为什么对于 MSVC、clang 和 g++,nullptr分配给类型数据成员指针的内部表示是 -1?Class::*对于 64 位系统来说(size_t)1 << 63是最好的,因为如果您nullptr以这种方式使用成员指针,您肯定会接触内核内存并发生崩溃,因此这将是一个很好的调试辅助工具。
-1背后有更深层次的原因吗?
样本:
struct X
{
int x, y;
};
using member_ptr = int X::*;
member_ptr f()
{
return nullptr;
}
Run Code Online (Sandbox Code Playgroud)
...使用 g++ 生成以下二进制文件:
movq $-1, %rax
ret
Run Code Online (Sandbox Code Playgroud) 既然C++ 0x几乎就在这里,我一直在试验它,特别是使用nullptr.如果需要使用它,我无法弄清楚应该包含哪些标准头文件.
任何帮助表示赞赏.
我只是有点困惑.
我什么时候应该使用nullptr?
我已经在一些网站上看到应该总是使用它,但是我不能为非指针设置nullptr,例如:
int myVar = nullptr; // Not a pointer ofcourse
Run Code Online (Sandbox Code Playgroud)
我应该总是使用NULL非指针和nullptr指针吗?
感谢任何帮助!我对c ++ 11(和c ++整体)很新.
C++中的nullptr与C#中的null相同吗?
似乎没有人在Google或Stackflow上问过这个问题.
考虑以下代码,是否可以安全地进行指针运算nullptr?
我假设nullptr在另一个结果中添加任何偏移nullptr,到目前为止MSVC产生的结果与我预期的一样,但是我有点不确定这样使用是否nullptr安全:
float * x = nullptr;
float * y = x + 31; // I assume y is a nullptr after this assigment
if (y != nullptr)
{
/* do something */
}
Run Code Online (Sandbox Code Playgroud)