我正在处理一些不是我写的代码。我有以下语句:
// p is type of std::unique_ptr<uint8_t[]>
if (p < 0) { /* throw an exception */ }
在这个上下文中,“
p < 0
”是什么意思呢?在文档页面上,我认为我的情况是“16) y < nullptr”,其中“0”是“nullptr”。但它具体是做什么呢?我正在处理一些不是我写的代码。我有以下语句:
// p is type of std::unique_ptr<uint8_t[]>
if (p < 0) { /* throw an exception */ }
p < 0
”是什么意思呢?在文档页面上,我认为我的情况是“16) y < nullptr”,其中“0”是“nullptr”。但它具体是做什么呢?unique_ptr < 0 OR what does less than operator do?
这将匹配cppreference上的重载(11):operator<(const unique_ptr&, nullptr_t);
。0会隐式转换为std::nullptr_t
。根据文档,结果是std::less<unique_ptr<T,D>::pointer>()(x.get(), nullptr)
。
结果在实现上是未定义的,但在大多数系统上都是无条件为false。假设在一个奇特的系统中,null没有二进制表示为0,则结果可能为true。
I believe my case is 16)
(16)与另一种情况相同:0 > unique_ptr
。结果相同。
nullptr
(或取决于您对“视为”的理解)。0隐式转换为std::nullptr_t
。 - eerorikaint x = nullptr
是不合法的。 - eerorikastd::nullptr_t
旨在与任何空指针常量一起使用,而不仅仅是nullptr
。 0(例如0L)也是空指针常量,因此可以使用它们来创建std::nullptr_t
。 - eerorikaauto p = std::make_unique<uint8_t[]>(pos_number);
然后我们改变数据p.get()
; 那么现在它对你来说完全没有任何意义,是吗? - Sagid请检查您的代码中是否有重载 operator <
的情况。这似乎是 (p < 0)
为 true
的唯一可能性。
例如:
bool operator< (const std::unique_ptr<uint8_t[]>&, int) { return true; }
int main() {
std::unique_ptr<uint8_t[]> p;
std::cout << (p < 0) << std::endl;
}
输出:
1
否则,正如其他人所说,0
会隐式转换为std::nullptr_t
,这将选择bool operator<(const unique_ptr<T, D>& x, nullptr_t)
重载,该重载将调用std::less(p, 0)
,它将返回false
(即使在具有-1
指针值的Windows上也是如此)。
false
。这要么是实现定义的,要么是未指定的(我不确定)。但我同意它可能在大多数(全部?)实现中返回 false
。另请参见 @eerorika 的答案。 - walnutstd::less
的实际实现都返回 false
。 - YSCfalse
。实际原因可能是零指针值由最低可能地址表示或类似的东西。 - walnut
p==-1
是一个无效的句柄。由于2^64
是一个非常巨大的数字,任何明智的p
都应该是正数。因此,p<0
检查WINAPI的无效句柄并不是一个好的代码实现。 - ALX23zuint8_t*
类型(或者甚至是uint8_t
数组类型)吗?我认为它们是void*
,不是吗? - walnutvoid*
,它们有宏HANDLE_PTR或类似的东西,基本上是long*
,如果我没记错的话。 - ALX23z