Fehler, Irrtümer, Fragen - Seite 1706

 
Комбинатор:

Ups, ich werde langsamer, das zweite Beispiel ist gar nicht richtig.

Deshalb ist es logisch, dass

Fehler: Ungültige Initialisierung einer Nicht-Konst-Referenz vom Typ 'int*&' aus einem r-Wert vom Typ 'int*'

Ja, ich habe oben bereits darüber geschrieben. Ich habe das zweite Beispiel geändert, aber es funktioniert immer noch nicht. Der Operator gibt einen Wert zurück, d.h. eine Kopie. Wir sind wohl alle drei so begriffsstutzig geworden, was? ))
 
Sergei Vladimirov:
Wir mussten alle drei so dumm sein, eh! ))
Warum funktioniert dann der erste Teil des fxsaber-Beispiels?
 
Комбинатор:
Warum funktioniert dann der erste Teil des fxsaber-Beispiels?

Warum sollte er das nicht tun? Er hat einen Ausdruck this[0], der einen Zeiger zurückgibt. Hier ist das Gleiche in einer anderen Form zu sehen:

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:
this[0] ist hier rWert.
Eben nicht so
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);
}


Ergebnis
2016.09.25 18:57:42.214 Test (RTS-12.16,M1)     5
Das Problem ist ein gewisser Unfug.
void A::operator =( A* )
Leider fehlt es an Vokabular, um dies zu erklären.
 
Das Problem ist, dass der Zeiger (Deskriptor) von rvalue irgendwie zu lvalue wird, nachdem er einer Variablen zugewiesen wurde. Es ist ein bisschen verrückt...
 

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

Результат

Das Problem ist eine gewisse Sinnlosigkeit

Leider ist das Vokabular für Erklärungen knapp bemessen.

OK, ich habe keine Lust zu denken. Ich bin schon müde.

 
Комбинатор:
Das Problem ist, dass der Zeiger (Deskriptor) von rvalue irgendwie zu lvalue wird, nachdem er einer Variablen zugewiesen wurde. Das ist ein bisschen verrückt...
Ja, ich bin es, der verwirrt ist. Nach
    A* a = this[0];
    a = new A; // так работает

Der Ausdruck

CheckPointer(this[0]) == POINTER_INVALID

wahr sein wird. Das macht durchaus Sinn.

Die Entwickler sollten den Grund, warum dies nicht möglich ist, klar und deutlich formulieren

this[0] = new A;
 
fxsaber:
Ja, ich habe es vermasselt.
Ja, ich war verwirrt. Ich hätte das überprüfen sollen, bevor ich etwas überstürzt habe. Wie auch immer, es ist alles in Ordnung :)
 
Комбинатор:
Kurz gesagt, es ist alles gut :)
Das letzte Beispiel verstehe ich immer noch nicht. Das Überladen des "="-Operators in der Klasse A verwandelt this[0] von rvalue in lvalue... Ich weiß nicht, wie. Ist das eine Art MCL-Funktion, bei den Profis gibt es ein solches Verhalten nicht.fxsaber, wie sind Sie überhaupt zu diesem Konstrukt gekommen? Ich meine Überlastung = in A. Oder durch Versuch und Irrtum?
 
Dem Zeiger wird ein r-Wert zugewiesen, der dann von new A überschrieben wird.