首页 > 解决方案 > 传递带有 const 内容的向量

问题描述

我有一个看起来像这样的向量。

std::vector<std::pair<int,int> > v;

我想将它传递给一个函数并使其保持不变。

首先我试过

void fun(const std::vector<std::pair<int,int> > v)

但那个功能让我有电话线

std::pair<int,int> p = v[i];

我认为应该抛出一个错误,因为 pair 不是 const 类型。然后我意识到只有在向量中声明为常量的指针,所以我尝试了

void fun(const std::vector<const std::pair<int,int> > v)

但这会引发关于没有转换的错误。

我敢肯定有一些我不理解的内部运作使这成为非法但希望有一些见解。谢谢。

标签: c++constants

解决方案


我认为您在这里混淆了引用和值语义。让您测试的第一个函数签名:

void fun(const std::vector<std::pair<int,int> > v)

这会将函数参数复制到一个新的 objectv中,该 object 是附加const限定的。这样的签名很少有意义:要么你想将它作为const引用传递(以避免复制),要么你想通过非const值传递它,因为函数体会改变参数,但应该对其唯一的副本进行操作。此外,这个片段:

std::pair<int,int> p = v[i];

使用上面的函数签名编译得很好,因为它将 位置处的向量元素复制i到一个新pair对象中。后者可以突变,但这根本不影响向量。

现在让我们考虑第二个函数签名:

void fun(const std::vector<const std::pair<int,int> > v)

与以前相同的方法仍然适用于此,此外,std::vector<const T>没有用处,请参阅此线程以获取解释。


如何解决?如果您不想复制参数,但函数不修改向量,请通过const引用传递它。如果函数修改了向量并且这些修改在调用端可见,则将其作为非const引用传递。如果函数修改了向量,但应该独立于调用端向量发生,则通过非const值传递。


推荐阅读