簡體   English   中英

為什么std :: sort不通過引用接受比較?

[英]Why doesn't std::sort accept comparator by reference?

std :: reference_wrapper上的標准解釋了std::sort現在接受std::reference_wrapper ,允許通過引用傳遞比較器。

有沒有理由std::sort沒有通過引用接受比較器?

簡而言之,沒有必要借鑒它; 它等於“按設計”決定。

我相信這個推理主要圍繞C ++和標准庫中存在的一些基礎知識很長一段時間;

  • 價值語義
  • 對實施施加盡可能少的限制

幾乎在任何地方都可以看到價值語義。 幾乎所有算法,容器等都期望其中包含的數據遵循正常的值規則,即表現得好像它們是內置類型。 這也是C ++類型系統背后的原因之一,使用戶類型的行為就像內置類型一樣。

算法的實現可以根據需要自由復制函數參數。 當允許實現復制仿函數時,將簽名限制為引用並不是很有用; 所以只需從一開始就允許復制。 這意味着函數對象不應該包含任何狀態,它可能不會被保留; 反過來,這有效地使仿函數非常輕,並且無論如何都沒有理由進行參考。

25.1 / 10 算法庫 (C ++草案n3797)

[注意:除非另有說明,否則允許將函數對象作為參數的算法自由復制這些函數對象。 對象標識很重要的程序員應考慮使用指向非復制實現對象(如reference_wrapper(20.9.3))或某種等效解決方案的包裝類。 - 尾注]

關於API設計的一般說明。 規范和標准的API設計,特別是模板的API設計,在最好的時候是一項非常重要的任務。 委員會今天是否會以不同的方式設計r值,參考折疊,完美轉發和移動語義? 我不知道。 在我看來,通過值獲取函數對象可以平衡與內部副本和移動相關的問題,可能的優化以及與臨時對象的綁定(pr值/ x值)。 這里的“普遍參考”可能會更好,但我覺得遺留的論點會超過支持變革的論據。

在C ++ 03中,通過引用接受比較器將阻止綁定到非const rvalue,例如函數指針表達式:

bool comp(T const&, T const&);
sort(first, last, &comp);

或者是一個臨時的函子:

struct Comparator { bool operator()(T const&, T const&) { ... } };
sort(first, last, Comparator());

在C ++ 11中,通過通用引用獲取比較器可以避免這個問題,但這是一個不必要的更改,因為我們有reference_wrapper

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM