其实写这篇文章我还是很忐忑的,因为用C++也写了快一年了,平时代码量个人认为还可以,但是最近两天频繁犯错,下面先说说我写的错误吧!
我们都知道make_pair返回的是一个pair类型的函数,而pair这个键值对它又是我们再用STL中map,unordered_map等容器必不可少的类型,所以平时我们插入都会写成make_pair这个函数,因为这样它不仅方便,更是高了代码美观性,是的代码看起来非常的简洁。那么,我们到底应该注意些什么呢?
先来看看下面的代码:
#include <iostream>
#include <string>
#include <utility>
#include <unordered_map>
using namespace std;
int main()
{
string a = "hello";
string b = "world";
unordered_map<string &, string &> um;
um.insert(make_pair(a,b));
return 0;
}
其实这个代码的错误我们一眼就看出来,类型与unordered_map的类型不匹配,但是我想问下,如果此时插入的话,用make_pair怎么插入呢?其实很明显,这里是不可以用make_pair直接插入的,有些人可能就迷惑了,为啥不能用make_pair啊?如果代码是这样的呢?
#include <iostream>
#include <string>
#include <utility>
#include <unordered_map>
using namespace std;
int main()
{
string a = "hello";
string b = "world";
unordered_map<string &, string &> um;
um.insert(make_pair("hello","world"));
return 0;
}
这样其实是也是错误的,也是类型不匹配,这个类型编译器会识别成const char*,所以此时这这哦那个情况是不可以用make_pair的,用pair时最好的。稍后解释原因,我们再来看一段代码:
#include <iostream>
#include <string>
#include <utility>
#include <unordered_map>
using namespace std;
int main()
{
string a = "hello";
string b = "world";
unordered_map<string &, string &> um;
um.insert(make_pair<string&, string&>(a, b);
return 0;
}
有些人可能就想,make_pair也是模版函数,那我就显示传参,然后在插入,事实证明,这也是错误的。C++98中,make_pair是这样的,如下:
别忘了,暂且先不说上述代码对不对,就先说说就算是代码是对的,那么此时make_pair返回的是一个匿名的pair类型,也就是说,在插入的时候因为用的不是emplace,所以它势必还会拷贝构造一次,但是此时它的值是不可以拷贝的,引用怎么拷贝?我们没见过说是拷贝引用吧?且先不说这个unordered_map这个插入,就是你自己平时如果实例化两个pair类型的对象,这两个对象势必不同,也就是咱们所说的深拷贝,所以,此时不可以用make_pair。其次,这个代码压根就是错误的,都过不了编译,怎么跑,所以绕来绕去就又回来了,为啥错了,其实这里在vs上可以清楚的看到,虽然你显示的传了string&,但是编译器会给你加一个std::remove_reference_t这个类型,它的功能是去除引用,所以此时构建的pair类型是pair<string,string>的,所以导致编译出现报错,所以这理最好是使用pair,先不说不方便还是其他的,就光光是把make_pair显示的写出了模版类型,这就已经和pair差不多了,且make_pair还是错误的。
而C++11干脆直接是右值引用,其中使用了完美转发,用了万能引用,如下:
这个其实也和上面的问题一样,就算显示的传了模版类型,和上面的还是一样的问题,就不再多说了。
而我个人感觉这个平时应该也不会有朋友发现这的错误吧,而我昨天写代码的时候,我用了unordered_map这个容器,而我用的类型是int,unique_ptr&,的类型,导致我用智能指针引用的原因是unique_ptr是不可以拷贝的,所以只能用引用,这才导致了前面的错误,上网查了很多,也没发现什么,然后就是自己看cplusplus网页,又在vs2019上写了一遍才发现。实在是很惭愧,快一年了,什么也没干,光写代码了,到头来还是一堆错误,不知道大家有什么遇见的错误,希望可以分享一下哦。
如果本篇文章对你有用的话,希望点赞收藏一下吧!!