为什么我必须将地图值的类型从&更改为(int*)&

Han*_*otc 0 c++ dictionary const

我有一个函数 getElement返回一个指向地图值的指针.

 int * getElement(const int &key) const {
        return (int*)&m.find(key)->second;
    }
Run Code Online (Sandbox Code Playgroud)

如果我使用return &m.find(key)->second它,例如它会创建一个编译错误:

在成员函数'int*A :: getElement(const int&)const'中:12:30:错误:从'const int*'到'int*'的无效转换[-fpermissive]

  • 为什么我必须更改&m.find(key)->second才能(int*)&m.find(key)->second正确编译代码?

#include <iostream>
#include <string>
#include <map>

class A {
    public:
    void addElement(const int &key, const int &value) {
         m.emplace(key,value);
    }
    int * getElement(const int &key) const {
        return (int*)&m.find(key)->second;
    }
    private:
    std::map<int,int> m;

};


int main()
{
  A a;
  int value = 1;
  int key = 1;
  a.addElement(key,value);
  int * x = a.getElement(1);
  std::cout << *x << std::endl;
  return 0;
}
Run Code Online (Sandbox Code Playgroud)

Kon*_*lph 5

为什么我要换&m.find(key)->second(int*)&m.find(key)->second

你没有.实际上,这样做可能会产生错误.相反,const如果您确实要修改地图值,请删除成员函数上的限定符.或者从函数返回一个const int*而不是一个int*.

为了澄清,当您将成员函数指定为存在时const,this该函数内的指针将成为指向const类实例的指针.反过来,这也使其数据成员具有const传递性.

结果,你std::map<int, int>成了std::map<int, int> constgetElement职能的一部分.此外,std::map::find对于const返回a的地图有一个重载const_iterator- 因此const int*.

事实上,要小心:std::map::iterator不一定T*.所以你不应该返回int*const int*- 你应该返回std::map<int, int>::iterator(或…::const_iterator).