传递具有常量内容的向量

pass vector with const contents

本文关键字:向量 常量      更新时间:2023-10-16

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

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)

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

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

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

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

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

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

使用上述函数签名可以很好地编译,因为它将位置i的 vector 元素复制到新的pair对象中。后者可以突变,但这根本不影响载体。

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

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

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


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

void fun(const std::vector<std::pair<int,int> > v)
{
////
std::pair<int,int> p = v[i];
}


https://en.cppreference.com/w/cpp/container/vector/operator_at

这里不会发生错误,因为 std::vector 对于 const 和非 const 实例都operator[]重载。在您的情况下,它将被解析为 const 版本并将const &返回到底层i元素。
请考虑以下代码:

void fun(const std::vector<std::pair<int,int> > v)
{
////
std::pair<int,int> p = v[i]; //OK
v[i] = std::pair<int,int>{10,20}; //Compile error, trying to modify const data!
}