![](/img/trans.png)
[英]Why a default constructor is needed using unordered_map and tuple?
[英]Why do I need to declare a default constructor in order to compile when returning an unordered_map value?
除非我取消注釋默認構造函數聲明,否則此示例無法編譯:
#include<unordered_map>
#include <iostream>
struct foo{
int data;
/*foo(){
data = 0;
std::cout << "DEFAULT\n";
}*/
foo(int d){
data = d;
std::cout << "PARAM\n";
}
};
struct bar{
std::unordered_map<int, foo> map;
foo getElem(int i){
return map[i];
}
};
int main() {
bar b;
foo f1(1);
foo f2(2);
b.map.insert({1,f1});
b.map.insert({2,f2});
foo f3 = b.getElem(1);
}
/opt/compiler-explorer/gcc-10.2.0/include/c++/10.2.0/tuple:1689:70: error: no matching function for call to 'foo::foo()'
1689 | second(std::forward<_Args2>(std::get<_Indexes2>(__tuple2))...)
| ^
當我取消注釋默認構造函數聲明並成功編譯時,面包屑顯示從未調用過默認構造函數。
這里發生了什么? 類似的問題是由於最令人煩惱的 parse ,但沒有任何顯式的構造函數調用,我不確定這里是否是這種情況。
這個答案提供了關於為什么 unordered_map 會隱式調用默認構造函數的提示。 問題是所描述的記錄行為和 MVP 的某種組合嗎?
當編譯器編譯這一行時:
foo f3 = b.getElem(1);
1
作為參數傳遞給 function (除非發生了很多優化魔法,這是不能保證的)。 這個 function 無法知道1
永遠不會是丟失的密鑰。 因此,在 map 中分配條目的代碼被調用。 如果缺少密鑰,則傳遞給此代碼的內容是什么? 是的,一個默認構造的foo
。
所以,簡而言之,你知道
從未調用過默認構造函數
但編譯器和 linker 沒有。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.