вставить константную пару против неконстантной пары против неконстантного ключа в unordered_map - PullRequest
0 голосов
/ 27 июня 2019

Я смотрю это видео CppCon: https://youtu.be/ncHmEUmJZf4?t=2284 (время 38:04)

Я не понимаю, в чем разница между звонками:

std::pair<iterator,bool> insert( const value_type& value );

и

std::pair<iterator,bool> insert( value_type&& value );

Я написал свой собственный код, и похоже, что в обоих случаях этот же конструктор вызывался.

#include <iostream>
#include <string>
#include <unordered_map>
using namespace std;

struct A
{
  A() noexcept                      {cout << "A()" << endl; }
  A(const A&) noexcept              {cout << "A(const A&)" << endl;}
};


int main()
{
    unordered_map<int, A> m;
    const pair<const int, A> p = {}; //first case OK
    //pair<const int, A> p = {};    //second case NOK
    //const pair<int, A> p = {};    //third case NOK
    cout << "---------" << endl;
    {
        m.insert(p);
        m.insert(p);
        m.insert(p);
        m.insert(p);
    }
    cout << "---------" << endl;
}

Выход для первого случая:

A()
---------
A(const A&)
---------

Выход для второго и третьего случая:

A()
---------
A(const A&)
A(const A&)
A(const A&)
A(const A&)
---------

1) Почему пара должна быть константой, чтобы не делать копию? (второй случай)

2) Почему ключ должен быть константным, чтобы не делать копию (ключ unordered_map в определении неконстантный)? (третий случай)

...