2017-10-07 42 views
2

C2280 - 试图引用一个已删除的功能是我收到错误时,我试图从initializer_list构造一个std ::地图>错误构建的std ::地图<T,的unique_ptr <S>>从initializer_list

我做了一个最简单的代码(见下文)代表我的问题:

#include <string> 
#include <map> 
#include <memory> 
using namespace std; 

int main() { 
    map<string, unique_ptr<int>> MyMap{ 
     { "first" ,make_unique<int>(6) }, 
     { "second",make_unique<int>(22) }, 
     { "third" ,make_unique<int>(86) } 
    }; 
} 

所以我知道的unique_ptr无法复制,但由于make_unique将返回右值,应该不是的unique_ptr移动进入初始化器_List? 顺便说一句,如果我用shared_ptr替换unique_ptr,那么问题就解决了,但不是我正在寻找的解决方案,我想保留初始化样式和unique_ptr。 那么在这一点上,这个对已删除函数的有问题的调用正在发生?有一种方法可以在不替换unique_ptr的情况下进行编译?

+0

不幸的是,它并没有真正那样工作。你必须明确地[移动](http://en.cppreference.com/w/cpp/utility/move)指针。 –

+0

我已经将make_unique ()包含在move函数中,仍然不会编译...我做错了吗?你能告诉我一个正确方法的例子吗? –

+3

@Someprogrammerdude:这不是问题。指针正在正确地移入初始化器列表中。但他们没有被移出初始化列表并进入地图。我不认为有这样做的好方法。 –

回答

3

不幸的是,这是std::initializer_list对象的限制之一。他们只提供const访问他们的元素,所以不可能移出他们的元素。你最好的选择是以旧式的方式初始化你的地图。

map<string, unique_ptr<int>> MyMap; 
MyMap["first"] = make_unique<int>(6); 
// etc. 

如果您需要的地图是const,您可以创建一个临时的地图,并从移动:

const map<string, unique_ptr<int>> myMap = [] { 
    map<string, unique_ptr<int>> m; 
    m["first"] = make_unique<int>(6); 
    // etc. 
    return m; // RVO or implicit move 
}(); 

您还可以使用的std::map范围内的构造,但你不得不为自己写一个特殊的迭代器类型,这会很烦人。

+1

您是否意味着在该lambda的末尾添加调用? –

+0

好吧,这很糟糕... xD然后,它是老式的时尚方式:) –

+0

@BenjaminLindley是的,谢谢你的发现。你也可以自己编辑答案:) – Brian

相关问题