使用 std::function 範本時,出現歧義可能由於多個可能的過載而出現。具體來說,請考慮以下程式碼片段:
#include
using namespace std;
int a(const function& f) { return f(); }
int a(const function& f) { return f(0); }
int x() { return 22; }
int y(int) { return 44; }
int main() {
a(x); // Call is ambiguous.
a(y); // Call is ambiguous.
}
歧義源自於這樣一個事實: function
std::function 的範本參數的簽章在宣告和定義期間被視為其型別的一部分。然而,在物件建構過程中並非如此。
std::function 與 C 中的許多函數物件一樣,使用稱為類型擦除的技術。這使得它能夠接受任意物件或函數,只要它們在呼叫時滿足預期的簽名即可。缺點是與不匹配簽章相關的錯誤發生在實作的深處,而不是在建構函式層級。
有三個主要選項來規避這種歧義:
雖然std::function 的模板參數確實在聲明和定義期間確定了其類型,但它在物件構造中不起任何作用。當構造函數接受任意參數時,這可能會導致歧義。為了解決這個問題,程式設計師可以使用明確型別轉換、函數物件包裝或 TMP。
免責聲明: 提供的所有資源部分來自互聯網,如果有侵犯您的版權或其他權益,請說明詳細緣由並提供版權或權益證明然後發到郵箱:[email protected] 我們會在第一時間內為您處理。
Copyright© 2022 湘ICP备2022001581号-3