因此,我有一个映射,用于存储具有已删除副本构造函数的类的对象,这是因为它具有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/