【问题标题】:C++: pass-by-reference and the const keywordC++:引用传递和 const 关键字
【发布时间】:2010-07-23 03:32:31
【问题描述】:

我有一个关于通过引用传递地图的问题。让我们考虑以下代码:

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,我认为这会使读者从方法的签名中不清楚上述含义。我知道可以发表评论,但我想我会问一下,以防您知道任何“程序化”方式。

谢谢,伙计们。

【问题讨论】:

标签: c++ pass-by-reference


【解决方案1】:

std::map 上的 [] 运算符是非常量的。这是因为如果未找到密钥,它将使用默认值添加密钥。所以你不能在 const 地图参考上使用它。请改用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;
    }
}

【讨论】:

  • 这引出了一个问题,为什么标准不允许不添加键的 const 版本的 operator []?
  • @Mark Ransom:我认为这个问题是在某处讨论过的。现在我想我得去找它了。
  • 感谢弗雷德和马克!我个人认为,纯粹从清晰的角度来看,通过 [] 隐式添加密钥的特性是危险的。虽然 map[x] = y;当我写 y = map[x] 时,我几乎不会尝试在 99% 的使用中将 x 添加到 map 中。在 99% 的情况下,我这样做是为了获取 map 中 x 的值(如果它已经存在)。如果没有,请通过将 y 设置为某个特殊值来告诉我。但是很高兴知道 C++ 的这个“特性”。再次感谢您的帮助。并感谢您的链接!
  • @hungh3:如果你真的想感谢我,请接受我的回答(点击计票下的复选标记)。 8v)
猜你喜欢
  • 2012-06-14
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2023-03-03
  • 1970-01-01
  • 1970-01-01
  • 2010-12-13
相关资源
最近更新 更多