2010-07-23 81 views
2

我有一个关于通过引用传递地图的问题。让我们看看下面这段代码:C++:传递引用和const关键字

void doNotChangeParams(const map<int, int>& aMap){ 

    if (aMap.find(0) != aMap.end()){ 
     cout << "map[0] = " << aMap[0] << endl; 
    } 
} 

,我有一个地图MYMAP做出这样的呼吁:doNotChangeParams(MYMAP)

现在,可以看出,我不会修改函数内部的参数aMap。不过,我的g ++编译器抱怨访问aMap [0]丢弃了限定符const

我把const因为我想告诉读者这个函数我没有修改参数。另外,当我不小心修改地图时,它有助于引发编译错误。

目前,我不得不放弃const,我认为它会使上述含义不清楚读者从方法的签名。我知道一个评论会做,但我想我会问,如果你知道任何“程序化”的方式。

谢谢,伙计们。

+0

的可能重复[?为什么不是STL地图中的\ [\]运营商常量(http://stackoverflow.com/questions/1474894/why-isnt -the-operator-const-for-stl-maps) – 2010-07-23 03:56:04

回答

4

[]运营商std::map是非常量。这是因为如果未找到密钥,它将添加具有默认值的密钥。所以你不能在常量映射参考中使用它。通过使用替代find返回的迭代:

typedef map<int, int> MyMapType; 

void doNotChangeParams(const MyMapType& aMap){ 
    MyMapType::const_iterator result = aMap.find(0); 
    if (result != aMap.end()){ 
     cout << "map[0] = " << result->second << endl; 
    } 
} 
+0

这就引出了一个问题,为什么没有标准允许不添加键的operator []的const版本? – 2010-07-23 03:40:52

+0

@Mark Ransom:我认为这个问题是在某处讨论的。现在我想我必须去找到它。 – 2010-07-23 03:42:53

+0

也许这:http://stackoverflow.com/questions/1639544/why-does-stdmap-operator-create-an-object-if-the-key-doesnt-exist/1639573#1639573 – 2010-07-23 03:45:09