当前位置: 首页 > 知识库问答 >
问题:

错误:将“const std::map”作为“this”参数传递将丢弃限定符[-fppermissive][duplicate]

郑博
2023-03-14

在gcc 5.4.0上,从const C std::map获取条目时无法编译。

test_map.cpp: In function ‘int main()’:
test_map.cpp:9:24: error: passing ‘const std::map<int, int>’ as ‘this’ argument discards qualifiers [-fpermissive]
                 foo[key];
// Compile with
// g++ test_map.cpp -o test_map

#include <map>

int main() {
    const std::map<int, int> foo;
    foo[0]; // compiles if "const" above is suppressed
}

这看起来类似于传递“const”。此参数丢弃限定符[-fppermissive],它是关于缓存的,而不是std::map。原因是:用户调用write()方法。该方法没有声明为const,这是有意义的,因为编写它可能会修改对象。

但是在这里,从地图中获取元素不会修改地图,是吗?

我的实际用例中的实际映射确实是常量。它在源代码中完全初始化。修改它是没有意义的。宣布它为非常量实际上解决了问题,但没有意义。


共有1个答案

南宫炜
2023-03-14

operator[]std::map中没有const限定符,您可以从文档中看到,例如std::map::operator[]-cppreference。通用域名格式

返回映射到与key等效的key的值的引用,如果该key不存在,则执行插入。

因此,不能直接在const实例上使用它。如果你能负担得起C 11的功能,可以使用at(ref std::map::at-cppreference.com)。

这些成员职能的声明如下:

T& operator[](const key_type& x);
T& operator[](key_type&& x);
T&       at(const key_type& x);
const T& at(const key_type& x) const;
 类似资料:
  • 我有与这里、这里或这里相同的问题,除了我为参数和函数设置了const: 但我有同样的编译错误:

  • 我有一个类缓存,它的函数write指定为 我这样调用这个函数。 上面的一行给了我以下错误 将“const Cache”作为“bool Cache::write(const MemoryAccess)”的“this”参数传递 this参数是特定于编译器的,它有助于代码混乱和中断本地命名空间变量优先级。但这样的变量并没有在这里传递。

  • 下面是一个基本的代码片段,我得到了一个错误: 错误:传递'constd::map 注意:我知道我可以在不使用的情况下删除点,但上面的代码片段只是一个更大问题的示例。 我检查了一些关于类似错误的问题: 错误:传递constd::映射 但在这两种情况下,都是因为被声明为。另一方面,我试图使用/访问的

  • 错误:将“const A”作为“void A::hi()”的“this”参数传递会丢弃限定符[-fppermissive] 我不明白为什么会出现这个错误,我没有返回任何东西,只是传递了对象的引用,就是这样。 编辑 我用const correction修复了它,但是现在我试图在同一个方法中调用方法,我得到了同样的错误,但奇怪的是我没有传递这个方法的引用。 错误:将“const A”作为“void A

  • 我将对象的引用传递给函数,并使用const表示它是只读方法,但如果我在该方法中调用另一个方法,即使我没有将引用作为参数传递,也会发生此错误。 错误:将'const A'传递为'valA::hello()'的'this'参数会丢弃限定符[-fpermissive] 错误:将“const A”作为“void A::world()”的“this”参数传递将丢弃限定符[-fpermissive]

  • 代码如下(为简洁起见摘录): 颜色h: 颜色cpp: 我得到以下错误: 颜色cpp:16:29:错误:传递“const std::map” 错误指的是“返回颜色[cColortype];”在getColorText中。 我写这篇文章是为了一个类项目,我可以通过删除getColorText签名中的const声明来让它工作,但我正在尝试学习/采用良好的实践,并遵循建议,在不修改数据的成员函数中使用co