Mam klasy foo
, z członkiem bar
typu std::shared_ptr<int>
:Przypisanie do std :: shared_ptr członek zmiennej
class foo
{
std::shared_ptr<int> bar;
/*other stuff here*/
};
W tej klasie I chcesz przypisać do bar
new int
. Ale nie mogę napisać bar = new int();
, ponieważ wskaźnik nie ma publicznego operatora przypisania.
Jak powinien Robię to? Mogłem std::move
lub std::swap
, ale żaden z nich nie wydaje się odpowiedni.
Zobaczyłem zmianę. Czy to się zmienia, inicjalizując 'int' na 0? 'new int()' would, 'new int' would not. – Bathsheba
'std :: make_shared (new int())' jest nieprawidłowe; 'make_shared' perfect - przekazuje argumenty do konstruktora' T'. Określono, aby skonstruować obiekt za pomocą ':: new (pv) T (std :: forward (args) ...), więc jeśli nie będzie żadnych argumentów, zostanie zainicjalizowana wartość. –
TartanLlama
@Bathsheba: Tak, nie ma "niezainicjowanych" form żadnej z funkcji 'make_ *'. Myślę, że coś takiego zostało zaproponowane tylko raz (jako część propozycji pozwalającej na uwzględnienie rozmiarów typów tablic dla make_ {shared, unique}), a propozycja została dostarczona z niezainicjowaną formą make _ * _, która używa domyślnej inicjalizacji. Ogólnie rzecz biorąc, standardowa biblioteka sprawia, że tworzenie niezainicjowanych wartości jest bardzo trudne, nawet jeśli czasami tego właśnie potrzebujesz ... –