微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

为什么我可以使用基于恒定范围的循环进行修改?

如何解决为什么我可以使用基于恒定范围的循环进行修改?

#include <iostream>
#include <map>

using namespace std;

int main()
{
    int number = 10;
    map<int*,int> intmap;
    intmap.insert(pair<int*,int>(&number,1));
    
    for (auto const &  x : intmap)
    {
        (*x.first)++;
        
    }

    for (auto const &  x : intmap)
    {
        cout << (*x.first) << "::" << x.second; //prints 11::1
    }
    return 0;
}

在这answer中提到了

如果您想处理原始项目,请选择 auto const &x 不会修改它们。

但是在上面的程序中,我可以修改它。看起来 for 循环中的 x 是常量指针而不是指向常量的指针。

解决方法

您不是在修改地图或地图元素。您正在修改指针对象,没有什么可以阻止您这样做(除了更改地图类型)。

x 的类型是 const std::pair<int* const,int>&,或者是对 const 对的引用。请注意,该对的第一个元素是一个常量指针,但它不是指向一个常量值
有了这个,你就不能修改任何一对元素(x.first++x.second++ 都会失败)。
然而,由于 x.first 是一个指向非常量 int 的 const 指针,*x.first 只是一个普通的 int&,这里没有 const,你可以增加它。

如果您想防止这种情况发生,您可以将映射键类型更改为 const int*,也就是。 指向 const int 的指针

map<const int*,int> intmap;

另请注意,即使使用非常量引用,您也无法修改键(或成对的第一个值):

for (auto &  x : intmap)
{
    x.first++; //fails
}
,

类似情况:

const int*

常量指针不能被修改,但是你可以用它来修改它所指向的东西。只有指向常量 int 的指针 for i in sorted(indexes,reverse=True): list.pop(i) 才能阻止这种情况发生。

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。