Pagina 1 di 1

[C++] Dubbio su costruttori impliciti

MessaggioInviato: 30/08/2021, 13:39
da ZfreS
Buongiorno a tutti. Sto cercando di capire un fatto riguardante la costruzione implicita di un oggetto in c++.
Supponiamo di avere questa funzione :
Codice:
 void impostaDimensione(const Vec&);
dove Vec è un oggetto definito in questo modo:
Codice:
template <class T>
class Vec
{
    public:
     
          Vec(T a, T b);
}


Il problema è questo: se chiamo nel main la funzione impostaDimensione nei primi due modi funziona, mentre nel terzo no.
Codice:
void main()
{
      impostaDimensione(Vec(10, 10)); // Primo modo
      impostaDimensione({10, 10});     // Secondo modo
      impostaDimensione(10, 10);        // Oppure   impostaDimensione((10, 10));  non funziona
}


Sostanzialmente il mio dubbio è: perche con le liste di inizalizzazione avviene la conversione implicita tra i valori interi passati come argomento nella funzione verso i parametri del costruttore, mentre non avviene con le normali parentesi tonde?

Re: [C++] Dubbio su costruttori impliciti

MessaggioInviato: 30/08/2021, 13:59
da vict85
Perché impostaDimensione(10, 10) viene visto come la chiamata alla funzione impostaDimensione(int, int) che tu non hai definito da nessuna parte. Insomma se si permettesse la notazione che tu proponi, ci sarebbero forti problemi di ambiguità nel linguaggio. Nessuno ci capirebbe più nulla.

Riguardo invece a impostaDimensione((10, 10)) è un po' più complesso, ma sostanzialmente dovrebbe essere equivalente a chiamare impostaDimensione(10). Per capire come mai leggi qui.

Re: [C++] Dubbio su costruttori impliciti

MessaggioInviato: 30/08/2021, 14:33
da ZfreS
Credo di aver capito, ma ma se io avessi scritto
Codice:
 impostaDimensione(())
e avendo nella classe Vec un costruttore di default, cmunque non lo avrei richiamato, se non scrivendo
Codice:
 impostaDimensione({})

Re: [C++] Dubbio su costruttori impliciti

MessaggioInviato: 30/08/2021, 16:07
da vict85
Fondamentalmente, hanno usato le parentesi graffe perché quelle tonde avevano già altri usi e usarle in quelle posizioni sarebbe stato poco chiaro. Inoltre i costruttori con le parentesi graffe hanno un comportamento leggermente diverso da quelli con parentesi tonde. L'uso delle parentesi graffe è sempre stato usato, sin dal C, per l'inizializzazione delle variabili e il C99 aveva introdotto i Compound Literals che sono molto simili.

Re: [C++] Dubbio su costruttori impliciti

MessaggioInviato: 31/08/2021, 09:48
da ZfreS
Grazie vict per i chiarimenti!