clear()
今日ハッキングをしていて、 std::priority_queue にメンバー関数がないことがわかりました。標準化委員会がこれを除外した理由について、技術的な理由はありますか?
明確にするために、割り当てを使用してこれを簡単に回避できることを認識しています。
oldPQ = std::priority_queue<int>{};
このソリューションは、次の理由であまり望ましくありません。
- タイプを繰り返す必要があります - これはメンテナンス中は機能しません。以下で @chris が指摘したように、デフォルトのコンストラクターを使用している場合はこれを単純化できますが、カスタム コンパレーターを使用している場合、これは不可能な場合があります。
std::priority_queue
clear()
メンバー関数を期待するテンプレート化された関数では使用できません。- 一般に、他のコンテナが提供する共通のインターフェースを満たさないことは望ましくありません。特に から までのすべて
std::forward_list
にstd::unordered_map
がstd::string
ありclear()
ます。私が注目している他の唯一の例外は、セマンティクスが意味をなさない std::array と、std::stack
余分な労力なしで動作するstd::queue
場合、セマンティクスがより疑わしい とです。std::deque
問題のように見えますが、実際にはそうである必要はありません: に使用される内部コンテナーstd::priority_queue
はテンプレート化されておりclear()
、独自のメンバー関数を持たない可能性があるため、興味深い問題が発生します。特に、下位互換性の問題が発生します。 . 次の理由により、これは問題ではありません。
- を提供しない内部コンテナの場合
clear()
、だれも を呼び出そうとしない限りstd::priority_queue::clear()
、コードはコンパイルを続けます。 - SFINAE では、
clear()
利用可能な場合は内部コンテナーを呼び出し、利用できない場合は繰り返しポップすることで、新しいインターフェイス (クリア メンバー) を提供することがまだ可能です。
これは C++ 標準の欠陥であるというのが私の意見です。技術的な議論が、なぜこの方法が省略されているかについての強い根拠を提供しないと仮定すると、私は標準案の作成を追求するつもりです.
編集:
これは委員会で処理されているようです (最後の投稿に注意してください): https://groups.google.com/a/isocpp.org/forum/?fromgroups#!searchin/std-discussion/clear/std-discussion/_mYobAFBOrM /ty-2347w1T4J