[C++] Dubbio su costruttori impliciti

Messaggioda ZfreS » 30/08/2021, 13:39

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?
[URL=https://datesnow.life]Authentic Ladies[/URL]
ZfreS
Cannot live without
Cannot live without
 
Messaggio: 2213 di 4590
Iscritto il: 22/10/2016, 17:52
Località: Usa

Re: [C++] Dubbio su costruttori impliciti

Messaggioda vict85 » 30/08/2021, 13:59

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.
vict85
Moderatore
Moderatore
 
Messaggio: 10465 di 19253
Iscritto il: 16/01/2008, 00:13
Località: Berlin

Re: [C++] Dubbio su costruttori impliciti

Messaggioda ZfreS » 30/08/2021, 14:33

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({})
[URL=https://datesnow.life]Authentic Ladies[/URL]
ZfreS
Cannot live without
Cannot live without
 
Messaggio: 2214 di 4590
Iscritto il: 22/10/2016, 17:52
Località: Usa

Re: [C++] Dubbio su costruttori impliciti

Messaggioda vict85 » 30/08/2021, 16:07

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.
vict85
Moderatore
Moderatore
 
Messaggio: 10466 di 19253
Iscritto il: 16/01/2008, 00:13
Località: Berlin

Re: [C++] Dubbio su costruttori impliciti

Messaggioda ZfreS » 31/08/2021, 09:48

Grazie vict per i chiarimenti!
[URL=https://datesnow.life]Authentic Ladies[/URL]
ZfreS
Cannot live without
Cannot live without
 
Messaggio: 2215 di 4590
Iscritto il: 22/10/2016, 17:52
Località: Usa


Torna a Informatica

Chi c’è in linea

Visitano il forum: Nessuno e 1 ospite