一对consts和const对之间的区别

jle*_*ahy 16 c++ const

在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 &用于参数类型.

  • 只是花了整整一天时间在堆栈跟踪,分解(来自MSVC ++和g ++)以及编译器调试选项中进行查找,以找出破坏性能的原因,而这恰恰是-在pair &lt;const int, set &lt;int &gt;&gt;`和`pair &lt;int,set &lt;int &gt;&gt;`。最后将const添加到一些函数签名中,速度几乎提高了三倍!:) (4认同)