Я смотрю это видео 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 в определении неконстантный)? (третий случай)