難題:
為什麼是std::&&]難題:
為什麼是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!
}
struct S {
運算子 bool() { 回傳 false; }
};
int main() {
S a、b;
bool are_equal(a == b); // 對 a 和 b 使用布林運算子!
}C 03 引入了 safe-bool 習慣用法,C 11 實作了明確 bool 轉換函數來防止此漏洞。
與 std::shared_ptr:
[ 的對比&&&]與 std::function 不同,std::shared_ptr 具有明確定義的相等語意。如果兩個指針都為空或都非空並且指向同一個對象,則兩個指針相等。這個明確的定義允許在 std::shared_ptr 中實現相等比較運算子。
解開謎團:不使 std::function 相等可比較的理由源於為任意可調用類型定義有意義的平等標準的固有挑戰。如果強制執行,它將給所有函數物件實現者帶來負擔,並且由於綁定參數的差異,它仍然可能導致不明確的比較。此外,缺少相等運算子可以有效消除隱式轉換產生的漏洞。
免責聲明: 提供的所有資源部分來自互聯網,如果有侵犯您的版權或其他權益,請說明詳細緣由並提供版權或權益證明然後發到郵箱:[email protected] 我們會在第一時間內為您處理。
Copyright© 2022 湘ICP备2022001581号-3