c++ - 传递带有 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)
但这会引发关于没有转换的错误。
我敢肯定有一些我不理解的内部运作使这成为非法但希望有一些见解。谢谢。
解决方案
我认为您在这里混淆了引用和值语义。让您测试的第一个函数签名:
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
值传递。
推荐阅读
- java - 将 ISO8601 日期时间格式转换为另一种 ISO8601 日期时间格式
- python - Airflow BranchPythonOperator 不执行一个分支
- angular - 在 Angular 7 迁移后,带有 target="_blank" 的超链接不起作用
- c# - 如何将 Net Core 应用程序或内部的某些数据设置为不可交换?
- r - 将数据集中的列表变量转换为因子
- regex - 替代正则表达式
- onedrive - 缩略图的 OneDrive REST API 返回不存在的 URL
- vba - 将文件名添加到电子邮件主题行并将电子邮件发送到 Last modified by/Author
- javascript - 如何返回嵌套的承诺?
- c++ - 我应该依赖复制省略还是移动语义?