2016-06-21 76 views
2

我確信我的問題已經在這裏回答了,但我無法找到它。如果是這樣,請將其標記爲重複 - 謝謝!重複的構造函數調用

這裏是MCVE:

#include <map> 
#include <stdio.h> 

using foo = struct foo 
{ 
    int foo2; 
    foo() { printf("In foo contructor.\n"); } 
}; 

std::map<int, foo> bar; 

int main() 
{ 
    bar [1] = {}; 
} 

輸出:

In foo contructor. 
In foo contructor. 

爲什麼叫兩次foo構造?爲了只被調用一次,我必須改變什麼?

編譯:gcc 4.9.3

編譯器標誌:-O3 -std=c++11 -Wall -Werror -Wextra

回答

3

operator[]已經默認構造其mapped_value,即使你不分配給它。然後,您的分配默認構造一個右值,然後將其分配到的密鑰1。 你看過http://en.cppreference.com/w/cpp/container/map/emplace嗎?它可能會做你想做的事。 OK。

+0

OK。我知道我需要時間直到我理解整個機制。用'emplace()'它可以工作。謝謝! –

+0

@AlBundy在cppreference上查看'std :: map :: operator []'和'std :: map :: operator ='的文檔。這些文章將幫助您瞭解如何以及何時在'std :: map'內部創建對象。 – KABoissonneault

+0

@KABoissonneault,我知道有一次'bar'操作,那是什麼時候?爲了'{}'構造一個'foo'對象? – BlackMamba