如果我有这样的容器......
std::map <std::string, IHaveAReallyExpensiveConstructor_t>
我保证只有在地图中创建新元素时才会调用构造函数IHaveAReallyExpensiveConstructor_t()
,例如std::map::operator[]
吗?
如果重要,只有默认构造很难。复制结构很便宜,而不是真正的问题。
答案 0 :(得分:5)
在C ++ 11中,operator[]
是std::map
上唯一需要mapped_value
默认构造的操作;所以这是唯一可以默认构造一个值的操作。如果您不提供任何构造函数参数,emplace
也将默认构造一个值。
如果您的实现不符合C ++ 11,则无法保证其他操作不会构造值;但没有理由为什么任何理智的实施。
答案 1 :(得分:0)
有两种情况: -
my_map [key] = value
1)如果键不在地图中,则复制&#34; value&#34;的构造函数。将被调用以在地图中制作该对象的副本。
2)如果地图中已存在密钥,则会调用该对象的赋值运算符。