簡體   English   中英

為什么在返回 unordered_map 值時需要聲明默認構造函數才能編譯?

[英]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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM