unique_ptr <0または演算子よりも少ないことは何ですか?


9

私が書いていないコードを扱っています。私はこの声明を持っています:

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

それではp < 0、この文脈ではどういう意味ですか?
上のドキュメントページ、私は私の場合はあると信じて16) y < nullptrいる、0ですnullptr

しかし、それは何をしますか?


1
x64では、カーネル範囲の正規ポインタに上位ビットが設定されているという事実に基づいて、ポインタがカーネルスペースに属しているかどうかを確認する(愚かなハードコードされた)方法である可能性があります。 。
マイケル・チョルダキス

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

回答:


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)です。

その結果、実装が定義されますが、ほとんどのシステムでは無条件にfalseになります。おそらく、nullに0のバイナリ表現がないエキゾチックなシステムでは、結果はtrueになる可能性があります。

私のケースは16だと思います)

(16)は他の点でも同じです0 > unique_ptr。結果は同じです。


しかし、コンパイラによって0考慮nullptrされますか?それは彼が思っていることだと思います。少なくとも、私にとっても意味がありません。
インスタンスの変更

@alteredinstance 0は "考慮"されていませんnullptr(または、考慮によって何を意味するかによって異なります)。0は暗黙的にに変換されstd::nullptr_tます。
eerorika

それは私が想定したことです。ブール比較と互換性のある2つしか見たことがないので、0to の暗黙的な変換に関するドキュメントがあるかどうか疑問に思っていnullptrます。それらは比較可能ですが、変換できないという印象を受けました。
インスタンスの変更

@alteredinstance変換は逆に起こりません。int x = nullptr不正な形式です。
eerorika

2
@alteredinstance std::nullptr_tは、任意のnullポインター定数で使用できるように設計されています。だけでなくnullptr。0(たとえば0Lも同様)はnullポインター定数であるため、を作成するために使用できるようになっています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(しても、Windows上で-1ポインタ値を)。


必ずしも戻るとは限りません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)は常にfalseを返します(std::less厳密な順序関数と同様)(demo)。


常に戻るとは限りませんfalse。実装するかどうかは、実装によって定義されるか、または指定されません。falseほとんどの(すべての)現在の実装では、おそらく常に戻ります。
クルミ

@walnut(たとえば、language-lawyerタグを介して)標準が何を言っているかについて質問が明確に質問しない限り、私は実用的な観点から回答しようとします。std::lessリターンのすべての実用的な実装false
YSC

それは結構です、私はあなたの推論を見つけられませんでした( " as std :: less is a strict order functor ")説得力があります。返品せずに厳格な注文にすることができますfalse。実用的な理由は、ゼロポインター値がそれらの線に沿って可能な限り低いアドレスまたは何かによって表されることです。
クルミ
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.