我注意到QMap::operator[](const Key & key)
有这两个overloads:
T & QMap::operator[](const Key & key)
const T QMap::operator[](const Key & key) const
是否有理由按价值返回?
因为我们已经移动了语义:
按值返回时,我们应该返回const值吗?
我问的原因是:
想象一下我们有:
class ExpensiveToCopy;
{
public:
int someProperty() const;
...
}
void f(const QMap<int, ExpensiveToCopy>& map)
{
int lala = map[4].someProperty(); // We need to copy the entire object
// just to look at someProperty();
}
答案 0 :(得分:11)
在const
情况下,我们无法向const
地图添加元素(如果它尚不存在),因此将返回本地对象。
否则,在非const
的情况下,在返回对它的引用之前,将使用指定的键创建一个元素(如果没有已经存在的那个)。
答案 1 :(得分:0)
我认为非引用const
是为了确保客户端代码无法通过任何方式修改map
。您知道如果使用const_cast<ExpensiveToCopy>map[4]
或其他方式,我们仍然可以修改map[4]
,但此map[4]
不能引用map
的第4个元素。
答案 2 :(得分:0)
也不可能将const类型的Value类型存储起来,因为按值返回需要Value :: operator =()。在我看来,QMap :: operator []的const版本是构思错误的。通过调用contains()和at()可以产生相同的效果。这是一个便利功能的示例,很好,很不方便。