Почему делает класс, используемый в качестве значения в потребности карты STL конструктор по умолчанию в …?

Ниже класс, используемый в качестве значения в карте:

class Book
{
    int m_nId;
public:
    // Book() { }  <----- Why is this required?
    Book( int id ): m_nId( id ) { }

};

Внутри основной ():

map< int, Book > mapBooks;

for( int i = 0; i &lt 10; ++i )
{
    Book b( i );
    mapBooks[ i ] = b;
}

Оператор, вызывающий ошибку:

mapBooks[ i ] = b;

Если я добавляю конструктора по умолчанию, ошибка не появляется. Однако я не понимаю почему потребность. Кто-либо может объяснить? Если я использую insert(), проблема не появляется.

Между прочим, я использую Visual C++ 2008 для компиляции.

7
задан skrrgwasme 14 December 2015 в 20:28
поделиться

1 ответ

оператор [] выполняет двухэтапный процесс. Сначала он находит или создает запись карты для данного ключа, затем возвращает ссылку на часть значения записи, чтобы вызывающий код мог читать или писать в нее.

В случае, если запись не существовала ранее, значение, половина записи должно быть сконструировано по умолчанию, прежде чем она будет присвоена. Именно так интерфейс должен работать, чтобы соответствовать случаю, когда запись уже существует.

Если необходимо использовать такой тип на карте, следует избегать использования оператора [] , используя find и insert «вручную» .

11
ответ дан 6 December 2019 в 23:04
поделиться
Другие вопросы по тегам:

Похожие вопросы: