Errori, bug, domande - pagina 2356

 
A100:

in C++: A::f()

Cosa dice questo codice?

((A*)&b).f();
 
fxsaber:

Cosa dice questo codice?

È lo stesso.

 
Ilya Malev:

La stessa cosa.

come MQL (supponendo che sia convertito in forma C++). Ma avresti potuto controllare tu stesso
 
A100:
Quello e MQL (supponendo che sia convertito in forma C++). Ma avresti potuto controllare tu stesso

Controllato:


 
Ilya Malev:

Controllato:

Credo che stiate controllando qualcosa di sbagliato.

B*b1=a;

Una tale voce in MQL significa copiare un oggetto a - in un oggetto localizzato dal puntatore b1. In generale, ovviamente, non dovrebbe compilare.

E per non confondere oggetti e puntatori, è meglio usare il prefisso p per i puntatori

 
Ilya Malev:

Controllato:

Per favore, non fatevi abbindolare da questo comportamento sbagliato.

Ci sono 2 problemi qui(?):

  1. B *b1=a - un errore esplicito, il compilatore percepisce questo costrutto come una chiamata dell'operatore di copia A::A(const A &).

  2. Nel primo caso, l'ottimizzatore ha rilevato che A::A(const A &) è vuoto, nessun membro - nessun accesso tramite "puntatore" (infatti, non c'è codice per chiamare l'operatore di copia, tutto è stato tagliato)
    la virtuale B::f() non è sovraccaricata, quindi invece di una chiamata virtuale era una semplice chiamata, non c'è indirizzamento ai membri in B::f(), quindi anche l'accesso tramite "puntatore" è stato eliminato

    Nel secondo caso, A::f() è una chiamata virtuale tentata, c'è un accesso tramite "puntatore", ma nessun oggetto a1, perché un costruttore di copia vuoto A::A(const A &) è stato chiamato anche per A *a1=b
 
Ilyas:

Per favore, non fate affidamento su questo comportamento sbagliato.

Ci sono 2 problemi qui(?):

Spero che sistemerete questo comportamento errato? (fare un errore di compilazione) Perché è possibile fare un tale errore per caso e il compilatore non reagisce in alcun modo.

 
Alexey Navoykov:

Spero che sistemerete questo comportamento errato? Perché è possibile fare un errore del genere per sbaglio e il compilatore non reagisce in alcun modo.

Sì, lo sistemeremo.

La priorità è impostata bassa perché solo le classi vuote ottengono codice funzionante

 
Ilyas:

Per favore, non fate affidamento su questo comportamento sbagliato.

Ci sono 2 problemi qui(?):

  1. B *b1=a - un errore evidente, il compilatore percepisce questo costrutto come una chiamata all'operatore di copia A::A(const A &)

  2. Nel primo caso, l'ottimizzatore ha determinato che A::A(const A &) è vuoto, nessun membro - nessun accesso tramite "puntatore" (infatti, non c'è codice per chiamare l'operatore di copia, tutto è stato tagliato)
    la virtuale B::f() non è sovraccaricata, quindi invece di una chiamata virtuale era una semplice chiamata, non c'è indirizzamento ai membri in B::f(), quindi anche l'accesso tramite "puntatore" è stato eliminato

    Nel secondo caso, A::f() è una chiamata virtuale tentata, c'è un accesso tramite "puntatore", ma nessun oggetto a1, perché un costruttore di copia vuoto A::A(const A &) è stato chiamato anche per A *a1=b

Grazie per la risposta dettagliata, tuttavia, sono un po' confuso sulla logica.

1) Perché il compilatore vede il costrutto B* b1=a come una chiamata all'operatore di copia A::A(const A&), (invece di chiamare B::B(const A&), perché è la classe B a sinistra dell'operatore=)

2) Perché il compilatore non ha generato l'avviso "copy constructor missing"?

3) perché una chiamata di metodo "semplice" è permessa per oggetti non esistenti (mentre un tentativo di chiamare direttamente B::f() dà un errore di compilazione "non è una chiamata di metodo statico")

4) E perché il compilatore permette una "semplice" chiamata di metodo virtuale? A mio parere, la virtualità non dovrebbe dipendere dalla presenza o assenza di dati nell'oggetto

 
Ilya Malev:

1) Perché il compilatore vede B* b1=a come una chiamata all'operatore di copia A::A(const A&), (invece di chiamare B::B(const A&), perché è la classe B a sinistra di operator=)

Questo è esattamente vero. Questo è un altro bug di MQL, che il compilatore permette liberamente cose come: B b = a; Questa è una violazione dei principi di incapsulamento. In C++ queste cose non si compilano naturalmente, è necessaria una conversione esplicita. E nelle vecchie build di MQL queste cose non potevano essere fatte altrettanto bene.

Motivazione: