Ich habe mich gefragt. Stellen Sie sich Folgendes vor:Können Sie einen STL-Container mit unique_ptr aus einer Initialisierungsliste initialisieren?
#include <iostream>
#include <map>
#include <memory>
int main() {
std::map< int, std::unique_ptr<int> > m =
{ { 1, std::unique_ptr<int>(new int(3)) } };
return(0);
}
Dies ist C++ 11. Es scheitert mit einem langen Rieses von Fehlermeldungen auf GCC, darunter ein
/usr/include/c++/4.9/ext/new_allocator.h:120:4: error: use of deleted function ‘constexpr std::pair<_T1, _T2>::pair(const std::pair<_T1, _T2>&) [with _T1 = const int; _T2 = std::unique_ptr<int>]’ { ::new((void *)__p) _Up(std::forward<_Args>(__args)...); }
Ist es möglich, überhaupt zu kompilieren zu tun, was ich versuche, hier zu tun? Ich stelle fest, dass mit shared_ptr es OK funktioniert. Ist es möglich, es mit unique_ptr zu tun? Wenn ja, was fehlt mir? Wenn nicht, warum nicht?
Ah, danke. Ich vermutete, dass so etwas passierte - "conexpr" schien ein Hinweis zu sein. –
@ mike4ty4 Der wahre Anhaltspunkt dort, was Marshall sagte, ist 'Verwendung von gelöschten Funktion [...] Paar (const std :: Paar <_T1, _T2> &) [mit _T1 = const int; _T2 = std :: unique_ptr] '. Das heißt: das scheitert, weil es ein Kopierkonstruktor ist, der versucht, beide Elemente zu kopieren, aber natürlich ist 'std :: unique_ptr' nicht kopierbar. Der Verschiebungskonstruktor würde Ihnen den gleichen Fehler geben, wenn Sie dies aufgerufen hätten –