是否定义了两个非void指针变量(根据C99和/或C++ 98)的差异NULL?
例如,假设我有一个如下所示的缓冲区结构:
struct buf {
char *buf;
char *pwrite;
char *pread;
} ex;
Run Code Online (Sandbox Code Playgroud)
比如说,ex.buf指向一个数组或一些malloc的内存.如果我的代码始终保证pwrite和pread点阵列中或一个过去,然后我相当有信心,ex.pwrite - ex.pread总是被定义.但是,如果pwrite和pread都是NULL.我可以只期望减去两个定义为(ptrdiff_t)0或严格兼容的代码需要测试指针为NULL吗?请注意,我感兴趣的唯一情况是两个指针都是NULL(表示缓冲区未初始化的情况).原因在于满足前面的假设,完全符合"可用"功能:
size_t buf_avail(const struct s_buf *b)
{
return b->pwrite - b->pread;
}
Run Code Online (Sandbox Code Playgroud) 我正在尝试实现一个分配器,它允许我使用带有 STL 类型的boost::interprocess::offset_ptr的“花哨”指针。
\n作为一个独立的模板,指针本身工作得很好,但我很难让它与std::vector或boost::containers::vector
我为指针实现的事情列表是:
\ntemplate<class T>\nclass OffsetPtr ...\nRun Code Online (Sandbox Code Playgroud)\n是否由C++标准保证,如果我有两个相同类型的指针,其值等于nullptr,那些指针之间的差异等于0?
在伪数学符号中,以下谓词是否成立?
ForAll x ForAll y(x == nullptr)^(y == nullptr) - >(x - y == 0)
我能想到的最简单的代码示例:
int* x = nullptr;
int* y = nullptr;
assert(x - y == 0);
Run Code Online (Sandbox Code Playgroud)
我想这可以归结为:是否有可能有一个有效的C++标准实现,其中有多个位表示nullptr只能比较为相等,因为相等运算符做了一些魔术?
被NULL - NULL定义为。?
被(char *)NULL - (char *)NULL定义为。?
被(uintptr_t)NULL - (uintptr_t)NULL定义为?
我知道它适用于我使用的所有实现。但从标准的角度来看,它是什么样子的呢?我找不到明确的答案。
编辑:从骗子看来,我认为问题的一个答案是:是的。
那么第二个问题和第三个问题呢?