C++ 为什么我在std::map上使用运算符[]无效?

C++ 为什么我在std::map上使用运算符[]无效?,c++,C++,假设我有一个类型为 std::map<int, Node> G; 如果某个节点在映射中,我想使用操作符[]返回该节点的引用;如果不在映射中,则创建一个新节点并返回引用。这就是我对文件内容的理解: 如果k与容器中元素的键匹配,则函数返回对其映射值的引用 如果k与容器中任何元素的键不匹配,则函数将插入一个具有该键的新元素,并返回对其映射值的引用。请注意,这始终会将容器大小增加1,即使没有为元素指定映射值(元素是使用其默认构造函数构造的) 但是,以下代码会抛出一个错误(g++5,std=

假设我有一个类型为

std::map<int, Node> G;
如果某个节点在映射中,我想使用操作符[]返回该节点的引用;如果不在映射中,则创建一个新节点并返回引用。这就是我对文件内容的理解:

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

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

但是,以下代码会抛出一个错误(g++5,std=gnu++11):

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

在我看到的所有示例中,
G[k]
出现在lhs上。
G[k]
是否不允许在rhs上使用?如果没有,原因是什么?

std::map::operator[]
返回一个
T&
引用

在这种情况下,
T
节点
,因此
G[3]
返回一个
节点&
引用,然后您尝试将其分配给
节点*
指针。这就是为什么会出现编译器错误

因此,您可以:

  • u_ptr
    更改为参考:

    Node& u_ptr = G[3];
    
  • 使用
    地址运算符将引用转换为指针:

    Node* u_ptr;
    u_ptr = &G[3];
    
  • std::map::operator[]
    返回一个
    T&
    引用

    在这种情况下,
    T
    节点
    ,因此
    G[3]
    返回一个
    节点&
    引用,然后您尝试将其分配给
    节点*
    指针。这就是为什么会出现编译器错误

    因此,您可以:

  • u_ptr
    更改为参考:

    Node& u_ptr = G[3];
    
  • 使用
    地址运算符将引用转换为指针:

    Node* u_ptr;
    u_ptr = &G[3];
    

  • 在你的教科书中查找指针。你正在分配一个指向
    节点
    的指针,但地图包含
    节点
    s。这与
    节点a没有区别;节点*b=au_ptr=&G[3]我一直在阅读“引用”作为“指针”的同义词S谢谢。请在您的教材中查找指针。您正在指定指向
    节点
    的指针,但地图包含
    节点
    S。这与
    节点a没有区别;节点*b=au_ptr=&G[3]我一直在阅读“引用”作为“指针”的同义词也值得一提的是
    auto&u_ptr=G[3]啊,非常愚蠢的错误。。。我一直把“引用”理解为“指针”的同义词。@RJTK:在编译的机器代码中,引用和指针通常会生成相同的代码。但在语义上,它们在语言中被视为不同的类型啊,非常愚蠢的错误。。。我一直把“引用”理解为“指针”的同义词。@RJTK:在编译的机器代码中,引用和指针通常会生成相同的代码。但在语义上,它们在语言中被视为不同的类型。