Už som si niečo vygooglil:
auto chars = make_shared<vector<char>>(initializer_list<char>{'a', 'b', 'c'});
toto posledné sa mi až tak nepáči, neni nato ešte nejaká krajšia syntax?
Trochu odbočím. vector je jedna z tříd, které takřka nedává smysl alokovat na heapu tímhle způsobem. Za nějakých 15+ let programování v c++ jsem udělal "new std::vector..." asi tak jednou a to jsem dělal hodně velkou divočinu. "new vector", "new string" a podobně je celkem spolehlivý způsob jak identifikovat špatně přeučeného Javistu.
Takže syntaxe, kterou chcete je pravděpodobně :
std::vector<char> chars = {'a', 'b', 'c'};
C++ se snaží o hodnotovou sémantiku. Pokud to jenom trochu jde, pak se věci chovají jako int - přímo jako chlívek na hodnoty ne jako nějaká samostatně existující entita někde na haldě.
Na haldě se obvykle vytváří "pár" objektů. Všechno ostatní jsou buď lokální proměnné ve funkcích, nebo membeři nějakých tříd. A i u těch dynamicky alokovaných objektů je často identitfikovatelný jeden zodpovědný vlastník, který má na něj unique_ptr. shared_ptr je pro případy, kdy se nedá obejít bez spoluvlastnictví. Cena za to je, že přestává být z kódu jasně patrné, kdy ten objekt zanikne.
Asi som sa nevyjadril jasne. Tým zápisom som nemyslel syntaktický cukor (inicializácia mimo konštruktoru), ale statickú vazbu. Member vytvorený bez operátoru new (make_shared, make_unique, alebo malloc) by mal vytvoriť objekt na stacku. Ale ak je celý objekt vytvorený na heape tak potom aj jeho member sa vytvorí na heape?
Member - členská proměnná nějaké třídy má pro sebe kus paměti přímo v té třídě. Velikost objektu je daná velikostí jeho memberů, protože jsou poskládané jeden za druhým. Member bude tam, kde ten objekt, kterého je členem.