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