gpt4 book ai didi

c++ - std::map::const_iterator 泄露了对值的非常量引用?

转载 作者:塔克拉玛干 更新时间:2023-11-03 01:26:32 26 4
gpt4 key购买 nike

我观察到 std::map::const_iterator 泄漏了对 value_type 的非常量引用:

#include <map>
#include <stdio.h>

int main (int argc, char *argv[])
{
std::map<int,int> foo = {{1,1},{4,2}};
const auto &m = foo;
const auto &it = foo.find(1);
printf("%d %d\n", it->first, it->second);
int &i = it->second;
i = 3;
auto &one = foo.at(1);
printf("%d %d\n", 1, one);
return 0;
}

输出

$ g++ test.cc && ./a.out 
1 1
1 3

这是预期的吗?为什么?编纂 std::map 的常量保护的唯一方法是将其包装在另一个类中吗?

最佳答案

这一行:

const auto &it = foo.find(1);

创建const referencestd::map<int,int>::iterator名为 it , 所以你不能修改 it本身或它引用的迭代器,但可以修改它指向的数据(作为迭代器)。它类似于常量指针与指向常量数据的指针。使用 m得到std::map<int,int>::const_iterator使用类型自动推导(它不必是 const 引用)或给它显式类型:

std::map<int,int>::const_iterator it = foo.find(1);

那么你不能通过那个迭代器修改数据。

关于c++ - std::map::const_iterator 泄露了对值的非常量引用?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/50705686/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com