c++ - 如何使用C++中带有不可复制成员的initializer_list创建映射?

标签 c++ dictionary move initializer-list

因此,我有一个映射,用于存储具有已删除副本构造函数的类的对象,这是因为它具有unique_ptr作为成员之一。我正在尝试使用std::initializer_list构造此 map ,但遇到一个巨大的错误,结尾是“使用删除的函数'constexpr std::pair <_T1,_T2>::pair(const std::pair <_T1,_T2>&)”。如果我正确理解,其原因是列表的成员不是临时成员,而是常量引用,因此,您既不能以隐式方式也不能以显式方式移动它们。
这是标题的一部分:

class ExitMessage {
public:
    ...
    ExitMessage( const std::string& text, 
                 std::initializer_list<std::map<std::string, ExitMessage>::value_type> subMessages);
    ...
private:
    std::string _text;
    std::unique_ptr<std::map<std::string, ExitMessage>> _subMessages;
    ...
};
这是有问题的构造函数:
ExitMessage::ExitMessage( const std::string& text,
                          std::initializer_list<std::map<std::string, ExitMessage>::value_type> subMessages )
    : _text( text ), _subMessages( new std::map<std::string, ExitMessage>( subMessages ) ) { }
因此,我该怎么做才能使用std::initializer_list创建此类的实例?

最佳答案

因此,我在构造函数上做了一些工作,并设法自己提出了解决方案。由于我的对象不可复制,因此将initializer_list对的第二个参数设置为右值没有任何弊端。std::initializer_list<std::pair<const std::string, ExitMessage&&>>但是,现在我无法为映射使用默认的构造函数,因此我不得不自己编写一个初始化循环。

ExitMessage::ExitMessage( const std::string& text,
                          std::initializer_list<std::pair<const std::string, ExitMessage&&>>&& subMessages )
    : _text( text ) {
    _subMessages = std::make_unique<std::map<std::string, ExitMessage>>();

    for (const std::pair<const std::string, ExitMessage&&>& subMessage : subMessages) {
        auto& subMessageRef = const_cast<std::pair<const std::string, ExitMessage&&>&>(subMessage);
        _subMessages->emplace( subMessageRef.first, std::move( subMessageRef.second ) );
    }
}
现在,我确定参数对象是临时对象还是显式移动的(由于复制构造函数的删除,这仍然是必需的,只是不用于列表本身),因此我可以安全地取消初始化initializer_list的成员并将其手动移动到 map 。

关于c++ - 如何使用C++中带有不可复制成员的initializer_list创建映射?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/63262032/

相关文章:

c++ - 一个类是一个命名空间

linux - grep 匹配模式的文件名并 move 到所需的文件夹

c++ - 强制复制赋值超过 move 赋值运算符

c++ - C++ 也可以解释而不是编译吗?

c++ - 没有可行的重载 '=' 错误 C++

c++ - gcc: undefined reference 错误

python - 在列表/字典错误中搜索

android - 室内自定义 map 应用

java - 查找出现次数最多的 map 值

c++ - xvalues : differences between non class types and class types