无序设置键是只读的,因此在这种情况下为什么我可以删除元素:
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
检测到了这一点。