亚洲在线久爱草,狠狠天天香蕉网,天天搞日日干久草,伊人亚洲日本欧美

為了賬號安全,請及時綁定郵箱和手機立即綁定
已解決430363個問題,去搜搜看,總會有你想問的

為什么std :: function不等于相等?

為什么std :: function不等于相等?

C++
米脂 2019-12-03 09:56:51
這個問題也適用于boost::function和std::tr1::function。std::function 不等于平等:#include <functional>void foo() { }int main() {    std::function<void()> f(foo), g(foo);    bool are_equal(f == g); // Error:  f and g are not equality comparable}在C ++ 11中,operator==和operator!=重載根本就不存在。在早期的C ++ 11草案中,重載被聲明為已刪除,并帶有注釋(N3092§20.8.14.2):// deleted overloads close possible hole in the type system它沒有說“類型系統中可能的孔”是什么。在TR1和Boost中,已聲明但未定義重載。TR1規范注釋(N1836§3.7.2.6):這些成員函數應保持未定義狀態。[ 注意:類似布爾的轉換打開了一個漏洞,可以通過==或比較兩個函數實例!=。這些未定義的void運算符消除了漏洞,并確保了編譯時錯誤。—尾注 ]我對“漏洞”的理解是,如果我們有bool轉換函數,則該轉換可用于相等比較(和其他情況):struct S {    operator bool() { return false; }};int main() {    S a, b;    bool are_equal(a == b); // Uses operator bool on a and b!  Oh no!}我給人的印象是,C ++ 03中的安全布爾用法和C ++ 11中顯式轉換函數的使用避免了這種“漏洞”。Boost和TR1都使用安全布爾用法,function而C ++ 11使bool轉換函數明確。作為同時具有兩者的類的示例,std::shared_ptr兩者都具有顯式bool轉換函數并且具有相等的可比性。為什么std::function平等不具有可比性?什么是“類型系統中可能的孔”?std::shared_ptr有何不同?
查看完整描述

3 回答

?
三國紛爭

TA貢獻1804條經驗 獲得超7個贊

為什么std::function平等不具有可比性?


std::function是用于任意可調用類型的包裝,因此,要完全實現相等性比較,您必須要求所有可調用類型都具有相等性,從而給實現函數對象的任何人帶來負擔。即使那樣,您也會得到一個狹義的等式概念,因為如果(例如)等效函數是通過以不同順序綁定參數構造的,則等效函數會比較不等式。我認為,在一般情況下無法測試等效性。


什么是“類型系統中可能的孔”?


我想這意味著刪除操作符,并確定使用它們永遠不會給出有效的代碼,比證明在某些以前未發現的極端情況下不存在不必要的隱式轉換的可能性要容易得多。


std::shared_ptr有何不同?


std::shared_ptr具有明確定義的相等語義;當且僅當兩個指針均為空或非空且指向同一對象時,兩個指針才相等。


查看完整回答
反對 回復 2019-12-03
?
料青山看我應如是

TA貢獻1772條經驗 獲得超8個贊

我可能錯了,但是我認為std::function對象的相等性在一般意義上是不可解決的。例如:


#include <boost/bind.hpp>

#include <boost/function.hpp>

#include <cstdio>


void f() {

    printf("hello\n");

}


int main() {

    boost::function<void()> f1 = f;

    boost::function<void()> f2 = boost::bind(f);


    f1();

    f2();

}

是f1和f2等于?如果我添加任意數量的函數對象,這些對象以各種方式相互包裝,最終歸結為對f... 的調用仍然相等,該怎么辦?


查看完整回答
反對 回復 2019-12-03
  • 3 回答
  • 0 關注
  • 1069 瀏覽

添加回答

舉報

0/150
提交
取消
微信客服

購課補貼
聯系客服咨詢優惠詳情

幫助反饋 APP下載

慕課網APP
您的移動學習伙伴

公眾號

掃描二維碼
關注慕課網微信公眾號