難題:
為什麼是std:: function,現代C 程式碼庫的一個組成部分,不具備相等比較功能?這個問題從一開始就困擾著程式設計師,導致管理可呼叫物件集合的混亂和困難。
早期的歧義:
在C 的早期草案中11 標準中,operator== 和operator!= 的重載被聲明但被刪除,留下了一個從未得到充分解釋的空洞。附帶的評論「關閉類型系統中可能存在的漏洞」暗示了一個隱藏的缺陷,但其本質仍然是個謎。
漏洞與保障:
The懷疑的「漏洞」源自於布林轉換函數的存在。在沒有明確相等比較運算子的情況下,此函數可以允許透過 == 或 != 進行隱式比較。但是,此漏洞可能會導致意外行為,如下所示:
<code class="cpp">struct S { operator bool() { return false; } }; int main() { S a, b; bool are_equal(a == b); // Uses operator bool on a and b! }</code>
C 03 引入了 safe-bool 習慣用法,而 C 11 實現了明確 bool 轉換函數來防止此漏洞。
與 std::shared_ptr 的對比:
與 std::function 不同,std::shared_ptr 具有明確定義的相等語意。如果兩個指針都為空或都非空並且指向同一個對象,則兩個指針相等。這個明確的定義允許在 std::shared_ptr 中實現相等比較運算子。
解開謎團:
不使std::function 相等可比較的基本原理源於為任意可調用類型定義有意義的平等標準的固有挑戰。如果強制執行,它將給所有函數物件實現者帶來負擔,並且由於綁定參數的差異,它仍然可能導致不明確的比較。此外,相等運算子的缺失有效地彌補了隱式轉換產生的漏洞。
以上是為什麼 `std::function` 缺乏相等比較?的詳細內容。更多資訊請關注PHP中文網其他相關文章!