为什么我在std :: map上使用Operator []无效?

RJT*_*JTK 0 c++

假设我有一个类型的地图

std::map<int, Node> G;
Run Code Online (Sandbox Code Playgroud)

节点如下

struct Node{
  Node(){};
  int data;
};
Run Code Online (Sandbox Code Playgroud)

我想使用operator []返回对节点的引用(如果它在地图中),或者创建一个新节点并返回引用(如果不是).这是我对文档说的内容的理解:

如果k匹配容器中元素的键,则该函数返回对其映射值的引用.

如果k与容器中任何元素的键不匹配,则该函数将使用该键插入一个新元素,并返回对其映射值的引用.请注意,即使没有为元素指定映射值(使用其默认构造函数构造元素),这也会将容器大小增加1.

但是,以下代码引发错误(g ++ 5,std = gnu ++ 11):

错误:无法在赋值u_ptr = G [3]中将'std :: map :: mapped_type {aka Node}'转换为'Node*';

Node* u_ptr;
u_ptr = G[3];
Run Code Online (Sandbox Code Playgroud)

在我看过的所有例子中,都G[k]出现在lhs上.G[k]rhs上是不允许的?如果没有,为什么?

Rem*_*eau 5

std::map<Key, T>::operator[]返回一个T&引用.

在这种情况下,TNode,所以G[3]返回一个Node&引用,然后您尝试将其分配给Node*指针.这就是您遇到编译器错误的原因.

所以,您可以:

  1. 改为u_ptr参考:

    Node& u_ptr = G[3];
    
    Run Code Online (Sandbox Code Playgroud)
  2. 使用&地址运算符将引用转换为指针:

    Node* u_ptr;
    u_ptr = &G[3];
    
    Run Code Online (Sandbox Code Playgroud)