【发布时间】:2013-09-01 11:01:18
【问题描述】:
我注意到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();
}
【问题讨论】:
-
只有一个重载按值返回,另一个返回引用。
-
@Joachim 是的,那是我不明白的事情。他们不应该都返回一个引用,例如 std::vector::operator[] 吗?
-
@nurettin 它确实禁止移动语义。
-
返回一个常量值确实阻止移动。移动构造函数更快因为它们被允许改变原始值,所以 const 会阻止它。
-
您需要在示例中使用
const QMap<int, ExpensiveToCopy> map;来触发const重载。