「労働者が自分の仕事をうまくやりたいなら、まず自分の道具を研ぎ澄まさなければなりません。」 - 孔子、「論語。陸霊公」
表紙 > プログラミング > なぜ `std::function` には等価比較がないのでしょうか?

なぜ `std::function` には等価比較がないのでしょうか?

2024 年 11 月 2 日に公開
ブラウズ:195

Why Does `std::function` Lack Equality Comparison?

std::function の等価比較の謎を解く

難問:

なぜ std::function なのか、最新の C コードベースの不可欠なコンポーネントですが、等価比較機能が備わっていませんか?この質問は、最初からプログラマーを当惑させており、呼び出し可能なオブジェクトのコレクションの管理に混乱と困難をもたらしています。

初期のあいまいさ:

C の初期ドラフト11 標準では、operator== および Operator!= のオーバーロードが宣言されましたが削除され、十分に説明されなかった空白が残されました。付随するコメント「型システムの可能性のある穴を塞ぐ」は隠れた欠陥を示唆していましたが、その性質は謎のままでした。

抜け穴と安全装置:

「抜け穴」の疑いは、ブール変換関数の存在に起因します。明示的な等価比較演算子がない場合、この関数では == または != を介した暗黙的な比較が可能です。ただし、次のように、この抜け穴は予期しない動作を引き起こす可能性があります。

struct S {
    operator bool() { return false; }
};

int main() {
    S a, b;
    bool are_equal(a == b); // Uses operator bool on a and b!
}

C 03 ではセーフ ブール イディオムが導入され、C 11 ではこの抜け穴を防ぐために明示的なブール変換関数が実装されました。

std::shared_ptr:[ とのコントラスト&&&]

std::function とは異なり、std::shared_ptr には明確に定義された等価性セマンティクスがあります。 2 つのポインタは、両方とも空である場合、または両方とも空ではなく同じオブジェクトを指している場合、等しいと見なされます。この明確な定義により、std::shared_ptr での等価比較演算子の実装が可能になりました。

The Enigma Unraveled:

std::function の等価性を比較できない理由これは、任意の呼び出し可能型に対して意味のある等価基準を定義するという固有の課題から生じています。これを強制すると、すべての関数オブジェクトの実装者に負担がかかり、バインディング引数の違いによりあいまいな比較が生じる可能性があります。さらに、等価演算子が存在しないため、暗黙的な変換によって生じる抜け穴が事実上閉じられます。

最新のチュートリアル もっと>
  • Tailwind CSS: 構成のカスタマイズ
    Tailwind CSS: 構成のカスタマイズ
    導入 Tailwind CSS は、近年 Web 開発者の間で非常に人気のあるオープンソース CSS フレームワークです。美しくモダンなユーザー インターフェイスを作成するための、カスタマイズ可能な独自のアプローチを提供します。 Tailwind CSS を他の CSS フレームワ...
    プログラミング 2024 年 11 月 3 日に公開
  • jQueryの使用
    jQueryの使用
    jQuery とは? jQuery は、HTML ドキュメントの走査、操作、イベント処理、アニメーションなどのタスクを簡素化するために設計された機能を備えた高速 Javascript ライブラリです。 「書く量を減らして、もっと増やす」 MDN の状態: jQuery を使用すると、複数行のコードと...
    プログラミング 2024 年 11 月 3 日に公開
  • CONCAT() は、完全な名前一致のために MySQL の検索機能をどのように強化できますか?
    CONCAT() は、完全な名前一致のために MySQL の検索機能をどのように強化できますか?
    WHERE 句の MySQL CONCAT() 関数を使用した効率的な検索一般的なデータベース操作の 1 つは、複数の列にわたるデータの検索です。ただし、姓名フィールドを別々に使用して名前を検索する場合、不完全な一致をキャプチャするなどの制限が発生する可能性があります。これを克服するには、MySQL...
    プログラミング 2024 年 11 月 3 日に公開
  • [デイリーパッケージ]ms
    [デイリーパッケージ]ms
    MS ms は、さまざまな時間形式をミリ秒に、またはその逆に変換します。 /* time format to milliseconds */ ms('2 days') // 172800000 ms('1d') // 86400000 ms('10h') // ...
    プログラミング 2024 年 11 月 3 日に公開
  • WordPress データベースをローカルから運用環境に移行することを検討する必要があります
    WordPress データベースをローカルから運用環境に移行することを検討する必要があります
    データベースをローカル環境から運用サーバーに移行するのは大変なことのように感じるかもしれませんが、適切なアプローチをとれば、そうする必要はありません。このガイドでは、スムーズな移行プロセスを確保するために考慮する必要がある重要なポイントについて説明します。 データベース移行に関する重...
    プログラミング 2024 年 11 月 3 日に公開
  • JavaScript のネストされたオブジェクトを理解する
    JavaScript のネストされたオブジェクトを理解する
    オブジェクトは、JavaScript 開発者として扱うものであり、言うまでもなく、これは TypeScript にも当てはまります。 TypeScript では、オブジェクト プロパティの型定義を定義する複数の方法が提供されます。この記事では、簡単な例から始めて高度な型定義に進みながら、それらのいく...
    プログラミング 2024 年 11 月 3 日に公開
  • コンストラクターのオーバーロード
    コンストラクターのオーバーロード
    メソッドと同様に、コンストラクターもオーバーロードできます。 コンストラクターのオーバーロードを使用すると、さまざまな方法でオブジェクトを作成できます。 MyClass クラスには 4 つのオーバーロードされたコンストラクターがあり、それぞれがオブジェクトを異なる方法で初期化します。 新しいステー...
    プログラミング 2024 年 11 月 2 日に公開
  • Node.js で JavaScript の力を解き放ちましょう!
    Node.js で JavaScript の力を解き放ちましょう!
    JavaScript はもはやブラウザーだけのものではありません。Node.js のおかげで、サーバー側も引き継ぎます。 ?経験豊富な開発者であっても、初心者であっても、Node.js をマスターすることはゲームチェンジャーです。 Node.js を始めるべき理由は次のとおりです: どこでも Jav...
    プログラミング 2024 年 11 月 2 日に公開
  • INMET-BDMEP 気候データの収集と処理
    INMET-BDMEP 気候データの収集と処理
    Os dados climáticos desempenham um papel crucial em diversos setores, auxiliando em estudos e previsões que impactam áreas como agricultura, planejame...
    プログラミング 2024 年 11 月 2 日に公開
  • LLP 登録: 主な利点と法的要件
    LLP 登録: 主な利点と法的要件
    ビジネスを有限責任パートナーシップ (LLP) として登録することは、柔軟性、法的保護、簡素化されたコンプライアンスの独自の組み合わせにより、起業家や専門家の間でますます人気のある選択肢となっています。 LLP 登録には明確な利点があり、合理化された効率的なビジネス構造を保証する特定の法的要件が伴...
    プログラミング 2024 年 11 月 2 日に公開
  • HLHealth レベル 7)
    HLHealth レベル 7)
    HL7 はヘルス レベル 7 とも呼ばれ、さまざまな医療システムにおける電子情報の統合、交換、管理、検索に使用されるメッセージングおよび臨床標準規格です。これは、患者の入院などのイベントによってトリガーされるトランザクションに基づくプロトコルです。 HL7 は、公衆衛生の分野での情報交換を促進します...
    プログラミング 2024 年 11 月 2 日に公開
  • Qt MainWindow を別のスレッドから安全に更新するにはどうすればよいですか?
    Qt MainWindow を別のスレッドから安全に更新するにはどうすればよいですか?
    Qt - 2 番目のスレッドによるメイン ウィンドウの更新マルチスレッド Qt アプリケーションで、別のスレッドからメイン UI (mainwindow.ui) を更新する課題を提起することができます。この記事では、カスタム スレッド内から UI 要素 (指定されたコードの ana->ui->hor...
    プログラミング 2024 年 11 月 2 日に公開
  • NgRx を使用して Angular 状態管理をマスターする
    NgRx を使用して Angular 状態管理をマスターする
    State management in Angular ensures that data is consistently and efficiently shared across all parts of an application. Instead of each component man...
    プログラミング 2024 年 11 月 2 日に公開
  • Hexabot のセットアップとビジュアル エディターのチュートリアル: 初めての AI チャットボットを構築する
    Hexabot のセットアップとビジュアル エディターのチュートリアル: 初めての AI チャットボットを構築する
    チャットボット愛好家の皆さん、こんにちは。このチュートリアルでは、オープンソースの AI チャットボット ビルダーである Hexabot をセットアップして使用するプロセスを説明します。まず、GitHub リポジトリのクローンを作成し、依存関係をインストールし、Hexabot の環境変数を構成します...
    プログラミング 2024 年 11 月 2 日に公開
  • mysql_fetch_row()、mysql_fetch_assoc()、および mysql_fetch_array(): どれを選択する必要がありますか?
    mysql_fetch_row()、mysql_fetch_assoc()、および mysql_fetch_array(): どれを選択する必要がありますか?
    mysql_fetch_row()、mysql_fetch_assoc()、および mysql_fetch_array() の説明背景:非推奨のものを使用している場合MySQL 拡張機能を使用すると、結果セットからデータを取得するために mysql_fetch_row()、mysql_fetch_a...
    プログラミング 2024 年 11 月 2 日に公開

免責事項: 提供されるすべてのリソースの一部はインターネットからのものです。お客様の著作権またはその他の権利および利益の侵害がある場合は、詳細な理由を説明し、著作権または権利および利益の証拠を提出して、電子メール [email protected] に送信してください。 できるだけ早く対応させていただきます。

Copyright© 2022 湘ICP备2022001581号-3