2015-08-28 16 views
7

Derleme yapamayacağım aşağıdaki kod var ve bu Cuma günü ve biraz frazzledim. Bir sorunC++ std :: unique_ptr std içinde saklanır :: harita silinen fonksiyonun kullanımı oluşturdu

int main() 
{ 
    std::pair< std::string, std::unique_ptr<A> > p { "B", make_unique<A>() }; 
    _map.insert(std::make_pair("C", make_unique<A>())); 
} 

olmayan

#include <string> 
#include <memory> 
#include <utility> 
#include <map> 

template< typename T, typename ...Args > 
std::unique_ptr<T> make_unique(Args && ...args) 
{ 
    return std::unique_ptr<T>(new T(std::forward<Args>(args)...)); 
} 

struct A 
{ 
}; 

std::map< std::string, std::unique_ptr<A> > _map = { { "A", make_unique<A>() } }; // <-- ERROR!! 

aşağıdaki derlemesinin alıyorum hata (yaklaşık olarak, çıkarılabilir şekilde g ++ kabartmak)

use of deleted function 'constexpr std::pair<...>(const st::pair<...> &) 
'constexp std::pair<...>::pair(const std::pair<...> &) is implicitly deleted because the default definition would be illegal. 

Argghh olan !! Sadece bunu C++ 11 standardında okuyun. 8.5.4 içinde belirtilen bir agregat, bir başlatıcı listesi tarafından başlatılır

, başlatıcı listesinin elemanları simge veya üye artan sırada, agrega üyelerine başlatıcıları olarak alınır. Her üyesidir kopyalamaya karşı başlatılmış başlatıcı, Fıkra

bummer tekabül den !!!

Başlatıcı listeleri ile sadece imkansız olup olmadığını bilen var mı?

+0

Başlatıcı listeleriyle çalışmak için buna gerçekten ihtiyacım var. Derleme kodu sadece örneğiydi. – ScaryAardvark

+0

Hmm. Sadece merak ediyorum. Initialiser_lists argümanlarının kopyalanabilir olmasını ister mi? Bu durumda, bir unique_ptr kopyalayamayacağınız gibi bir hata anlamlı olacaktır – ScaryAardvark

+3

[This] (http://stackoverflow.com/questions/8193102/initializer-list-and-move-semantics) ilgili görünüyor .... –

cevap

5

Bu konuda fazla bir şey yapamazsınız: Bir başlatıcı listesindeki öğeler kopyalanır. Bu sadece hareket eden sınıflarla birlikte olmaz.

Bu "kusuru" atlamak için bir yol var, ancak okumak çok hoş değil; Eğer aralığında myMap iterate yapmak ve oldukça kopyalama yerine, içindeki öğeleri hareket edecek

using map_type = std::map< std::string, std::unique_ptr<A> >; 
using pair_type = map_type::value_type; 
pair_type elements[] = { { "A", std::make_unique<A>() }, { "B", std::make_unique<A>() } }; 

map_type myMap { std::make_move_iterator(begin(elements)), std::make_move_iterator(end(elements)) }; 

karar verirler. Yöntem this diğer sorudan alınmıştır.

+0

Bu etrafta dolaşmanın iyi bir yolu ama güzel dediğiniz gibi değil. Ancak şu anda sahip olduğum problemi çözdüğünüzde altın yıldızı elde edersiniz: o) – ScaryAardvark

İlgili konular