0

原来我真的不明白 const.. 所以我有这个(最小化)代码示例。当我尝试调用可以访问 const 类对象 (-> GetData()) 成员的函数时,出现以下错误:

错误(gcc 11.2):

<source>:129:28: error: passing 'const std::unordered_map<int, A>' as 'this' argument discards qualifiers [-fpermissive]
  129 |         return some_data_[0];
      |                            ^
In file included from /opt/compiler-explorer/gcc-11.2.0/include/c++/11.2.0/unordered_map:47,
                 from <source>:103:
/opt/compiler-explorer/gcc-11.2.0/include/c++/11.2.0/bits/unordered_map.h:983:7: note:   in call to 'std::unordered_map<_Key, _Tp, _Hash, _Pred, _Alloc>::mapped_type& std::unordered_map<_Key, _Tp, _Hash, _Pred, _Alloc>::operator[](std::unordered_map<_Key, _Tp, _Hash, _Pred, _Alloc>::key_type&&) [with _Key = int; _Tp = A; _Hash = std::hash<int>; _Pred = std::equal_to<int>; _Alloc = std::allocator<std::pair<const int, A> >; std::unordered_map<_Key, _Tp, _Hash, _Pred, _Alloc>::mapped_type = A; std::unordered_map<_Key, _Tp, _Hash, _Pred, _Alloc>::key_type = int]'
  983 |       operator[](key_type&& __k)
      |       ^~~~~~~~

代码

#include <unordered_map>

class A
{

public:

    A() : cnt_(0) {}
    A(int cnt) : cnt_(cnt) {}

    int& GetCnt() {
        return cnt_;
    };

private:
    int cnt_;
};

class B
{
public:
    B(int nr) {
        some_data_ = { { 0, A(nr) } };
    }

    const A& GetData() const {
        return some_data_[0];
    }

private:
    std::unordered_map<int, A> some_data_;
};

int main()
{
    const B b_obj(2);

    b_obj.GetData();
}

我是否理解正确

  1. 当我定义一个类类型对象 const 时,所有成员也都变为 const 吗?
  2. 所有成员 const 也意味着这种 constness 以某种方式转化为 unordered_map-contents 是 const?如果是这样,怎么做?添加限定符背后是否有一些模板魔法?
  3. 如果上述假设是正确的,除了通过 const X const 函数之外,我如何将 const 类的成员(在这种情况下为映射值)的只读访问权限传递给外部函数?
4

0 回答 0