在 C++ 中,std::pair<const T, const U>
之间的行为有什么区别?和 const std::pair<T, U>
?
最佳答案
核心区别在于它们是不同的不相关类型(它们之间有一些隐式转换)。
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);
}
虽然存在允许 f(pc)
的隐式转换要编译,该行涉及转换,转换涉及制作longstring()
的拷贝 s。另一方面,调用f(cp)
仅在类型匹配时绑定(bind)对现有对的常量引用,不需要任何拷贝。
编译器让你编写类似的代码这一事实并不意味着编译代码是为了做同样的事情。对于具有隐式转换的类型尤其如此,如 std::pair
的情况。
在编写仿函数以对存储在 map 中的元素进行操作时,这是一个常见的陷阱,其中仿函数的参数不匹配会导致不必要的对象数据复制:
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 << " ";
});
上面的 lambda 没有正确类型的参数( std::pair<int,std::string
与 std::pair<const int,std::string>
),这会导致每次调用都复制索引和值(即所有字符串都将被复制到 std::pair<int,std::string>
然后是 lambda 参数的引用绑定(bind))。在这种情况下,简单的建议是使用 std::map<int,std::string>::value_type const &
对于参数类型。
关于c++ - const 对和 const 对之间的区别,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/14631005/