Errores, fallos, preguntas - página 1706

 
Комбинатор:

Uy, me estoy frenando, el segundo ejemplo no es del todo correcto.

Por eso es lógico que

error: inicialización inválida de una referencia no-const de tipo 'int*&' desde un rvalue de tipo 'int*'

Sí, ya escribí sobre ello más arriba. He modificado la segunda muestra pero sigue sin funcionar. El operador devuelve un valor, es decir, una copia. Los tres nos habremos quedado tan obtusos, ¡eh! ))
 
Sergei Vladimirov:
Los tres teníamos que ser tan tontos, ¡eh! ))
Entonces, ¿por qué funciona la primera pieza del ejemplo de fxsaber?
 
Комбинатор:
Entonces, ¿por qué funciona la primera pieza del ejemplo de fxsaber?

¿Por qué no habría de hacerlo? Tiene una expresión this[0] que devuelve un puntero. Aquí está lo mismo en una forma diferente:

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] es rvalue aquí.
Exactamente no así
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);
}


Resultado
2016.09.25 18:57:42.214 Test (RTS-12.16,M1)     5
El problema es una tontería.
void A::operator =( A* )
Por desgracia, el vocabulario es escaso para explicarlo.
 
El problema es que el puntero (descriptor) de rvalue se convierte de alguna manera en lvalue después de ser asignado a una variable. Es un poco loco...
 

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

Результат

El problema es un cierto sinsentido

Por desgracia, el vocabulario es escaso para la explicación.

Vale, no tengo ganas de pensar. Ya estoy cansado.

 
Комбинатор:
El problema es que el puntero (descriptor) de rvalue se convierte de alguna manera en lvalue después de ser asignado a una variable. Eso es un poco loco...
Sí, soy yo quien está confundido. Después de
    A* a = this[0];
    a = new A; // так работает

La expresión

CheckPointer(this[0]) == POINTER_INVALID

será cierto. Lo cual tiene mucho sentido.

Los promotores deben formular la razón por la que es imposible de forma clara y agradable

this[0] = new A;
 
fxsaber:
Sí, lo he estropeado.
Sí, me confundí. Debería haberlo comprobado antes de precipitarme. De todos modos, todo está bien :)
 
Комбинатор:
En resumen, todo está bien :)
Sigo sin entender el último ejemplo. La sobrecarga del operador "=" en la clase A convierte este[0] de rvalue en lvalue... No sé cómo. ¿Es algún tipo de característica de la ACM, no hay tal comportamiento en los profesionales.fxsaber, ¿cómo has llegado a esta construcción? Me refiero a la sobrecarga = en A. ¿O por ensayo y error?
 
Al puntero se le asigna un valor r, que luego es sobrescrito por el nuevo A.