c++ - const 对和 const 对之间的区别

标签 c++ constants

在 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::stringstd::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/

相关文章:

c++ - 在预处理器指令中使用变量

C++ - 在 header 中初始化变量与使用构造函数

c++ - 使用 C++11 initializer_list 实现类 std::array 容器

c++ - const 可以,但不是 constexpr?

c++ - 在没有 const_cast 的情况下将 const void* 转换为其他指针时出错

c++ - OpenCL 内核是异步执行的吗?

c++ - 在 C/C++ 中 for 语句参数内的算术运算

我们可以通过指针改变一个用const定义的对象的值吗?

c++ - 通过 constness 从结构传递到它的指针和引用成员

c++ - 基于范围的切片 for 循环?