Ho scritto del codice S s;
... s = {};
, aspettandomi che finisse come lo S s = {};
. Tuttavia non lo fece. Il seguente esempio riproduce il problema:Risoluzione di sovraccarico: assegnazione di parentesi graffe vuote
#include <iostream>
struct S
{
S(): a(5) { }
S(int t): a(t) {}
S &operator=(int t) { a = t; return *this; }
S &operator=(S const &t) = default;
int a;
};
int main()
{
S s = {};
S t;
t = {};
std::cout << s.a << '\n';
std::cout << t.a << '\n';
}
L'output è:
5
0
Le mie domande sono:
- Perché
operator=(int)
selezionato qui, invece di "ambiguo" o l'altro ? - C'è una soluzione ordinata, senza cambiare
S
?
Il mio intento è s = S{};
. Scrivere s = {};
sarebbe conveniente se funzionasse. Attualmente sto usando s = decltype(s){};
ma preferirei evitare di ripetere il tipo o il nome della variabile.
'{}' a 'int' è la conversione dell'identità ([\ [over.ics.list \]/9] (http://eel.is/c++draft/over.ics.list#9)). '{}' a 'S' è una conversione definita dall'utente ([\ [over.ics.list \]/6] (http://eel.is/c++draft/over.ics.list#6)). Giuro di aver visto una domanda molto simile ieri ... –
@ T.C. se è così, credo che avrei potuto risparmiarmi qualche tempo di sviluppo leggendo più domande ieri! –
Mi sembra di aver commesso lo stesso errore in molti punti del mio codice ... ad es. Di solito uso 'void clear() {* this = {}; } 'con l'intento di ripristinare un oggetto al suo stato inizializzato dal valore –