【问题标题】:std::unordered_map non assignable internal pair. How?std::unordered_map 不可分配的内部对。如何?
【发布时间】:2019-01-24 00:35:33
【问题描述】:

如果*map_it& 返回到std::pair,这怎么行? Visual Studio 将我指向pair& operator=(const volatile pair&) = delete;。这是如何工作的?这里发生了什么样的超载魔法?

在尝试实现哈希表时发现它。我希望键是常量,值是可变的,整个对是不可分配的。看了一下Visual Studio 的实现,我还是想不通。我相信这一定是一个我仍然不知道的非常简单的规则。

这是一个例子:

#include <unordered_map>

int main() {
    std::unordered_map<int, int> map;
    map[1] = 2;
    auto map_it = map.begin();
    auto & map_pair = *map_it;

    // How can they prevent this?
    map_pair = std::pair<int const, int>(1, 2);

    // And this one?
    std::pair<int const, int> p(1, 2);
    map_pair = p;

    return 0;
}

【问题讨论】:

    标签: c++ unordered-map assignment-operator


    【解决方案1】:

    它实际上被禁用了:

    pair& operator=(const volatile pair&) = delete;
    

    您可以对方法执行此操作。例如

    class foo {
        public:
            foo(const foo &) = delete; // disallows copy construction
            foo &operator(foo const &) = delete; // disallows move construction
    };
    

    如果你想覆盖一个值并且使用 C++17,你可以使用 std::unordered_map::insert_or_assign()。我认为否则您可以使用一对 (int, int *) 映射,并更改指针处的值,而不是尝试更改值本身。

    该术语是deleted function,从 C++11 开始

    如果,而不是函数体,特殊语法 = delete ;被使用,函数定义为删除。对已删除函数的任何使用都是格式错误的(程序将无法编译)。这包括显式调用(使用函数调用运算符)和隐式调用(调用已删除的重载运算符、特殊成员函数、分配函数等)

    【讨论】:

    • 我现在在搜索时记得不能分配给 const 变量。 std::pair 可能正在使用一些 snifae 技巧来禁用 operator= 如果其中一个成员恰好是 const。
    • @JoãoPires 如果并非所有成员都是可赋值的(以及其他原因),编译器本身可以自动删除隐式生成的赋值运算符。在这种情况下,用于std::(unordered_)map::value_typestd::pairfirst 成员被声明为const Key,因此不可分配,因此编译器可以删除value_typeoperator=,如果代码没有删除它明确(根据 OP 的声明,显然正在完成)。
    猜你喜欢
    • 2017-01-11
    • 2011-08-19
    • 2020-08-03
    • 2013-06-12
    • 1970-01-01
    • 2016-03-14
    • 1970-01-01
    • 2021-04-23
    • 2011-03-19
    相关资源
    最近更新 更多