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!
}