unique_ptr <0或小于运算符的作用是什么?


9

我正在处理不是由我编写的代码。我有这句话:

// p is type of std::unique_ptr<uint8_t[]>
if (p < 0) { /* throw an exception */ }

那么p < 0在这种情况下意味着什么呢?
文档页面,我相信我的情况是16) y < nullptr,这里0nullptr

但是它是做什么的呢?


1
基于以下事实:在x64中,内核范围内的规范指针已设置了高位,这可能是一种(愚蠢的硬编码)检查指针是否属于内核空间的方法-如果以下答案正确,则否。
Michael Chourdakis

1
在WINAPI中p==-1是无效的句柄。由于这2^64是一个荒谬的数字,任何明智的p做法总是积极的。因此,p<0检查WINAPI的无效句柄。这不是一个好代码。
ALX23z

@OP:您能否澄清一下此代码在哪个上下文中使用?是在Linux还是Windows上使用?指针的值是否与某些WINAPI代码相关?我认为,如果您对此进行了澄清,以上评论可能是一个很好的答案。
胡桃

@ ALX23z但是WINAPI句柄应该是类型uint8_t*(还是的数组uint8_t)?我认为是void*,不是吗?
胡桃

@walnut他们不是void*宏HANDLE_PTR或基本上是long*iirc的东西。
ALX23z

Answers:


2

unique_ptr <0或小于运算符的作用是什么?

它与cppreference上的重载(11)匹配operator<(const unique_ptr&, nullptr_t);。0隐式转换为std::nullptr_t。根据文档,结果为std::less<unique_ptr<T,D>::pointer>()(x.get(), nullptr)

结果是实现定义的,但在大多数系统上可能是无条件错误的。大概在一个外来系统上,其中null不具有0的二进制表示形式,结果可能为true。

我相信我的案子是16)

(16)是相同的其他方式:0 > unique_ptr。结果是一样的。


但是编译器0考虑nullptr了吗?我想这就是他想知道的。至少对我来说也没有意义。
alteredinstance

@alteredinstance 0未被“考虑” nullptr(或取决于您所考虑的意思)。0隐式转换为std::nullptr_t
eerorika

这就是我的假设。我想知道是否有关于0to 的隐式转换的文档nullptr,因为我只看到两者与布尔比较兼容。它们是可比的,但我给他们留下了不可转换的印象。
alteredinstance

@alteredinstance转换不会反过来发生。int x = nullptr格式不正确。
eerorika

2
@alteredinstance std::nullptr_t设计为可与任何空指针常量一起使用;不只是nullptr。0(例如0L)是空指针常量,因此可以将它们用于创建std::nullptr_t
eerorika

2

检查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的回答
胡桃木

0

该表达式与此模板运算符匹配(0转换为nullptr):

template <class T, class D>
bool operator<(const unique_ptr<T, D>& x, nullptr_t);

这将返回std::less<unique_ptr<T,D>::pointer>()(p.get(), nullptr)始终为假(就像std::less严格的顺序函子一样)(demo)。


它并不总是返回false。是否这样做是实现定义的还是未指定的。false尽管在大多数(所有)当前实现中,它可能总是会返回。
胡桃

@walnut除非有明确的问题(例如,通过language-lawyer标签)询问标准的含义,否则我将尝试从实际角度进行回答。所有实际执行std::less退货false
YSC

很好,我只是没有发现您的理由(“ as std :: less是严格的顺序函子 ”)具有说服力。可能是严格的命令,不能退货false。实际原因是零指针值由可能的最低地址或沿这些行的东西表示。
胡桃
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.