如果我有这样的容器....
std::map <std::string, IHaveAReallyExpensiveConstructor_t>
Run Code Online (Sandbox Code Playgroud)
我保证IHaveAReallyExpensiveConstructor_t()只有在地图中创建一个新元素时才会调用构造函数,比如说std::map::operator[]?
如果重要,只有默认构造很难.复制结构很便宜,而不是真正的问题.
在C++ 11中,operator[]是唯一std::map需要mapped_value默认构造的操作; 所以这是唯一可以默认构造一个值的操作.emplace如果您不提供任何构造函数参数,也将默认构造一个值.
如果您的实现不符合C++ 11,则无法保证其他操作不会构造值; 但没有理由为什么任何理智的实施.