无序设置键是只读的,因此在这种情况下为什么我可以删除元素:

std::unordered_set<std::string> s;
s.emplace("sth");
s.erase("sth");

而在这不是:
std::unordered_set<std::string const> s;
const std::string str("sth");
s.emplace(str);
s.erase(str);

如果将自身设置为const会很有意义,但是使用const键我不太明白。该断言失败:
static_assert(!is_reference<_Tp>::value && !is_const<_Tp>::value, "");

为什么写那个断言的人会检查key是否不是const?

编辑:

实际上,上面的代码对于std::set可以很好地编译。对于std::unordered_set,失败直接发生在实例化上。重现的最小示例:
// define a customized hash ...
int main() { sizeof(std::unordered_set<int const>); }

最佳答案

您不能删除元素的原因不是因为const-correctness。

这是因为您不能拥有const事物的容器。这是不允许的。

您违反了unordered_set的契约(Contract)。
static_assert检测到了这一点。

10-08 08:55
查看更多