Errori, bug, domande - pagina 1706

 
Комбинатор:

Ops, sto rallentando, il secondo esempio non è affatto corretto.

Ecco perché è logico che

errore: inizializzazione non valida di un riferimento non-const di tipo 'int*&' da un rvalue di tipo 'int*'

Sì, ne ho già scritto sopra. Ho modificato il secondo campione ma ancora non funziona. L'operatore restituisce un valore, cioè una copia. Tutti e tre dobbiamo essere diventati così ottusi, eh! ))
 
Sergei Vladimirov:
Tutti e tre dovevamo essere così stupidi, eh! ))
Allora perché il primo pezzo dell'esempio di fxsaber funziona?
 
Комбинатор:
Allora perché il primo pezzo dell'esempio di fxsaber funziona?

Perché non dovrebbe? Ha un'espressione this[0] che restituisce un puntatore. Ecco la stessa cosa in una forma diversa:

int a;

int* Func(int& i)
{
   return(&i);
}

int* p = Func(a);   // работает, то же что A* a = this[0]
Func(a) = new int;  // не работает, то же, что и this[0] = new int
 
Sergei Vladimirov:
questo[0] è rvalue qui.
Esattamente non così
class A
{
public:    
  int Tmp;
  
  void operator =( A* )
  {
  }

  void operator =( const int Value )
  {
    this.Tmp = Value;
  }
};

class B
{
public:  
  A* Data[];
  
  B()
  {
    ArrayResize(this.Data, 1);
  }

  A* operator []( const int Pos )
  {
    return(this.Data[Pos]);
  }
  
  void Init()
  {
    // this[0] = new A; // ошибка выполнения: invalid pointer access
    this.Data[0] = new A;
    
    this[0] = 5; // this[0] - НЕ rvalue
  } 
};

void OnStart()
{
  B b;
  
  b.Init();
  
  Print(b[0].Tmp);
}


Risultato
2016.09.25 18:57:42.214 Test (RTS-12.16,M1)     5
Il problema è una sciocchezza.
void A::operator =( A* )
Purtroppo, il vocabolario è scarso per spiegarlo.
 
Il problema è che il puntatore (descrittore) da rvalue in qualche modo si trasforma in lvalue dopo essere stato assegnato a una variabile. È un po' folle...
 

fxsaber:
Точно не так

Результат

Il problema è una certa inutilità

Purtroppo, il vocabolario è scarso per la spiegazione.

Ok, non ho voglia di pensare. Già stanco.

 
Комбинатор:
Il problema è che il puntatore (descrittore) da rvalue in qualche modo si trasforma in lvalue dopo essere stato assegnato a una variabile. Questo è un po' folle...
Sì, sono io che sono confuso. Dopo
    A* a = this[0];
    a = new A; // так работает

L'espressione

CheckPointer(this[0]) == POINTER_INVALID

sarà vero. Il che ha perfettamente senso.

Gli sviluppatori dovrebbero formulare il motivo per cui è impossibile in modo chiaro e piacevole

this[0] = new A;
 
fxsaber:
Sì, ho fatto un casino.
Sì, mi sono confuso. Avrei dovuto controllare prima di saltare la pistola. Comunque, va tutto bene :)
 
Комбинатор:
In breve, va tutto bene :)
Continuo a non capire l'ultimo esempio. Il sovraccarico dell'operatore "=" nella classe A trasforma questo[0] da rvalue in lvalue... Non riesco a capire come. È una specie di caratteristica di MCL, non c'è questo comportamento nei professionisti.fxsaber, come sei arrivato a questo costrutto? Voglio dire sovraccarico = in A. O per tentativi ed errori?
 
Al puntatore viene assegnato un valore r, che viene poi sovrascritto dal nuovo A.
Motivazione: