赋值中的重复构造函数调用

时间:2016-06-21 15:05:03

标签: c++11 constructor stl

我确信我的问题已在此处得到解答,但我无法找到它。如果是这样,请将其标记为重复 - 谢谢!

这是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

1 个答案:

答案 0 :(得分:3)

operator[]已经默认构建其mapped_value,即使您没有分配它。然后,您的分配默认构造一个右值,然后将其移动分配到键mapped_value的{​​{1}}。 你看过https://jsfiddle.net/2kv6Ldom/1/了吗?它可能会做你想做的事。