2016-06-21 63 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