在C++中,std::pair<const T, const U>和之间的行为有什么不同const std::pair<T, U>?
Dav*_*eas 15
核心区别在于它们是不同的不相关类型(其中包含一些隐式转换).
void f(std::pair<std::string,std::string> const &);
std::string longstring();
int main() {
std::pair<const std::string,const std::string> pc
= std::make_pair(longstring(),longstring());
f(pc);
const std::pair<std::string,std::string> cp
= std::make_pair(longstring(),longstring());
f(cp);
}
Run Code Online (Sandbox Code Playgroud)
虽然有隐式转换,使f(pc)编译,该行涉及的转换,并且转换涉及制作副本中的longstring()秒.另一方面,f(cp)当类型匹配时,调用仅绑定对现有对的常量引用,不需要任何副本.
编译器允许您编写类似代码的事实并不意味着代码被编译为执行相同的操作.对于具有隐式转换的类型尤其如此,如同的情况一样std::pair
当编写仿函数来操作存储在地图中的元素时,这是一个常见的陷阱,其中仿函数参数的不匹配将导致不必要的对象数据复制:
std::map<int,std::string> m = create_map();
std::for_each(m.begin(),m.end(),
[](std::pair<int,std::string> const &r) {
std::cout << r.second << " ";
});
Run Code Online (Sandbox Code Playgroud)
上面的lambda没有正确的参数类型(std::pair<int,std::stringvs. std::pair<const int,std::string>),这会导致每次调用都复制索引和值(即所有字符串都将被复制到一个std::pair<int,std::string>参数绑定到lambda的参数) .在这种情况下,简单的建议是std::map<int,std::string>::value_type const &用于参数类型.