如何在C++中使用不可复制的成员从initializer_list创建映射



因此,我有一个映射,它存储具有已删除的复制构造函数的类的对象,因为它的成员之一是unique_ptr。我试图使用std::initializer_list构建这个映射,但我遇到了一个巨大的错误,以"结尾;使用已删除的函数'constexpr std::pair&lt_T1,_T2>:对(const-std::对<_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 ) );
}
}

由于我现在确信参数对象要么是临时的,要么是显式移动的(这在以前仍然是一个要求,因为删除了复制构造函数,只是不适用于列表本身(,所以我可以安全地取消初始化列表的成员,并手动将它们移到映射中。

最新更新