我观看了这段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)为什么对必须为const才能不进行复制? (第二种情况)
2)为什么键必须为const才能不进行复制(定义中unordered_map的键为非const)? (第三种情况)