Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/cplusplus/135.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C++ 具有常量内容的传递向量_C++_Constants - Fatal编程技术网

C++ 具有常量内容的传递向量

C++ 具有常量内容的传递向量,c++,constants,C++,Constants,我有一个像这样的向量 std::vector<std::pair<int,int> > v; std::vector v; 我想把它传递到一个函数中,使它成为常数 首先我试过 void fun(const std::vector<std::pair<int,int> > v) void fun(const std::vector v) 但是这个功能让我有了线路 std::pair<int,int> p = v[i]; std

我有一个像这样的向量

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

std::vector v;
我想把它传递到一个函数中,使它成为常数

首先我试过

void fun(const std::vector<std::pair<int,int> > v)
void fun(const std::vector v)
但是这个功能让我有了线路

std::pair<int,int> p = v[i];
std::对p=v[i];
我认为应该抛出一个错误,因为pair不是const类型。然后我意识到只有指针在向量中被声明为常量,所以我尝试了

void fun(const std::vector<const std::pair<int,int> > v)
void fun(const std::vector v)
但这就产生了一个错误,即没有转换


我确信有一些我不理解的内部运作机制使得这是非法的,但我希望有一些见解。谢谢。

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

void fun(const std::vector<std::pair<int,int> > v)
使用上面的函数签名可以很好地编译,因为它将位置
i
处的向量元素复制到一个新的
pair
对象中。后者可以变异,但这根本不会影响载体

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

void fun(const std::vector<const std::pair<int,int> > v)
void fun(const std::vector v)
与前面相同的方法在这里仍然适用,此外,
std::vector
没有用处,请参阅以获取解释



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

另一个不合适的原因:声明
void-fun(const-std::vector v)
void-fun(std::vector v)
相同,顶级简历资格被忽略。@Caleth抱歉,我不明白。你忘了模板类型中的
const
吗?不,我的意思是“顶级cv限定符从参数类型中删除”@Caleth有趣,我不知道这一点。谢谢你的提示!
void fun(const std::vector<std::pair<int,int> > v)
{
   ////
   std::pair<int,int> p = v[i];
}
void fun(const std::vector<std::pair<int,int> > v)
{
   ////
   std::pair<int,int> p = v[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!
}