dire che ho un struct
come questo:Posso usare std :: make_shared con le strutture che non hanno un costruttore parametrico?
struct S
{
int i;
double d;
std::string s;
};
Posso fare questo?
std::make_shared<S>(1, 2.1, "Hello")
dire che ho un struct
come questo:Posso usare std :: make_shared con le strutture che non hanno un costruttore parametrico?
struct S
{
int i;
double d;
std::string s;
};
Posso fare questo?
std::make_shared<S>(1, 2.1, "Hello")
No non è possibile, è necessario definire il proprio costruttore per essere in grado di farlo.
#include <iostream>
#include <memory>
#include <string>
struct S
{
S(int ii, double dd)
: i(ii)
, d(dd)
{ }
int i;
double d;
};
int main()
{
// S s{1, 2.1};
auto s = std::make_shared<S>(1, 2.1);
//or without constructor, you have to create manually a temporary
auto s1 = std::make_shared<S>(S{1, 2.1});
}
Ho fatto il secondo e ho capito come funziona se devo passare i parametri del costruttore. Perché passo un oggetto e funziona? – Narek
Quando si passa un oggetto, si richiama il costruttore della copia della struttura. – Wyzard
firma di make condivisa è: make_shared (_Args && ... __args) Nel secondo caso i tuoi argomenti sono un oggetto completo e quando viene inoltrato chiama il costruttore di copia dell'oggetto, risultando in una nuova S ben costruita, S –
ho potuto compilare passando un oggetto '' S' al parametro make_shared' troppo, ma tra parentesi è necessario passare non l'oggetto, ma i parametri del costruttore. – Narek