传递具有常量内容的向量
pass vector with const contents
我有一个看起来像这样的向量。
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!
}
- 为什么C++常量模板化向量在使用之前没有初始化?
- 如何返回向量的常量引用?
- 初始化指针的常量向量
- 将编译时常量向量转换为堆分配版本
- 在<uint8_t> <char> c++ 中将常量向量转换为常量向量
- 无法在声明时使用初始值设定项列表初始化常量字符*/字符串数组的向量
- C++ 获取向量中常量字符* [ ] 的长度
- 如何在 c++ 中将向量转换为<string>常量字符* const*?
- 当类具有常量时,将对象插入到向量中
- C++模板,用于通过常量引用和原始指针传递向量
- 对向量<常量字符 *> 进行排序
- 非常量对象的向量似乎在基于范围的 for 循环中被视为常量
- 对常量向量进行常量unique_ptr
- C++向量迭代:常量 vs. 常量自动 vs. 无常量
- 传递具有常量内容的向量
- 返回对私有向量成员元素的非常量引用是否是一种不好的做法
- 常量向量中的非常量
- 静态常量 std::<char>没有堆的向量初始化?
- 如果方法是常量,如何找到向量的中位数?
- 如何将智能指针向量转换为常量向量,该常量向量包含指向常量的智能指针