为什么无法初始化地图?

Why can't the map be initialized?

提问人:Alberto Tiraboschi 提问时间:4/8/2022 最后编辑:Vlad from MoscowAlberto Tiraboschi 更新时间:4/8/2022 访问量:369

问:

给定以下代码,

#include <iostream>
#include <string>
#include <mutex>
#include <string_view>
#include <unordered_map>

struct sstruct {
    std::string content;
    std::string_view name;
    std::mutex mtx;

    sstruct(std::string content_, std::string_view name_)
            : content(std::move(content_)), name(name_) {
    }

    std::string get_content() {
        return "";
    }
};

int main() {

    std::unordered_map<std::string, sstruct> map{
            {
                    "pippo", {"dddd", ""}
            }
    };

    std::cout << map["pippo"].content << std::endl;
}

这不会编译,并出现以下错误:

C:\Users\alt\Desktop\main.cpp(23): error C2440: 'initializing': cannot convert from 'initializer list' to 'std::unordered_map<std::string,sstruct,std::hash<std::string>,std::equal_to<std::string>,std::allocator<std::pair<const std::string,sstruct>>>'
C:\Users\alt\Desktop\main.cpp(27): note: No constructor could take the source type, or constructor overload resolution was ambiguous

我想避免在构造函数中初始化互斥锁。

https://godbolt.org/z/eqKG6jac1

C++ 复制构造函数 初始值设定项列表 move-constructor deleted-functions

评论

5赞 Alan Birtles 4/8/2022
您可能至少需要使可移动。 还需要默认可构造sstructmap["pippo"]sstruct

答:

4赞 Vlad from Moscow 4/8/2022 #1

问题在于该类既不可复制也不可移动。std::mutex

考虑重新设计你的班级,比如

struct sstruct {
    std::string content;
    std::string_view name;
    static std::mutex mtx;

    sstruct(std::string content_, std::string_view name_)
            : content(std::move(content_)), name(name_) {
    }

    std::string get_content() {
        return "";
    }
};

否则,请尝试如下操作

std::unordered_map<std::string, sstruct> map;

auto [it, success] = map.try_emplace( "pippo", "dddd", "" );

if ( success )
{ 
    std::cout << it->second.content << std::endl;
}

auto it2 = map.find( "pippo" );

if (it2 != map.end())
{
    std::cout << it2->second.content << '\n';
}

auto &obj = map.at( "pippo" );
std::cout << obj.content << '\n';

评论

1赞 Alberto Tiraboschi 4/8/2022
我认为这是不可能的。我需要在地图的每个条目上都有不同的互斥锁
0赞 VLL 4/8/2022
@AlbertoTiraboschi 然后,您应该创建一个处理互斥体成员的移动构造函数。
0赞 xiaofei 4/8/2022 #2

unordered_map::operator[]有两种情况,键存在时间和返回值;当键不存在时,将插入一个空值,并且该值的类型需要无参数构造函数

评论

0赞 xiaofei 4/8/2022
斯罗伊!!原来的答案是错误的。我修改了原来的答案