Erreurs, bugs, questions - page 1706

 
Sergei Vladimirov:
Il fallait qu'on soit tous les trois si bêtes, hein ! ))
Alors pourquoi le premier élément de l'exemple de fxsaber fonctionne-t-il ?
 
Комбинатор:
Alors pourquoi la première pièce de l'exemple de fxsaber fonctionne-t-elle ?

Pourquoi ne le ferait-il pas ? Il a une expression this[0] qui renvoie un pointeur. Voici la même chose sous une forme différente :

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:
ce[0] est la valeur r ici.
Exactement pas comme ça
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);
}


Résultat
2016.09.25 18:57:42.214 Test (RTS-12.16,M1)     5
Le problème est un non-sens.
void A::operator =( A* )
Malheureusement, le vocabulaire est rare pour l'expliquer.
 
Le problème est que le pointeur (descripteur) de rvalue se transforme en quelque sorte en lvalue après avoir été affecté à une variable. C'est un peu fou...
 

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

Результат

Le problème est une certaine inutilité

Malheureusement, le vocabulaire est rare pour l'explication.

OK, je n'ai pas envie de réfléchir. Déjà fatigué.

 
Комбинатор:
Le problème est que le pointeur (descripteur) de rvalue se transforme en quelque sorte en lvalue après avoir été affecté à une variable. C'est un peu fou...
Oui, c'est moi qui suis confus. Après
    A* a = this[0];
    a = new A; // так работает

L'expression

CheckPointer(this[0]) == POINTER_INVALID

sera vrai. Ce qui est parfaitement logique.

Les développeurs doivent formuler la raison pour laquelle c'est impossible de manière claire et agréable.

this[0] = new A;
 
fxsaber:
Oui, j'ai fait une erreur.
Oui, je me suis embrouillé. J'aurais dû vérifier avant de sauter le pas. Bref, tout va bien :)
 
Комбинатор:
En bref, tout va bien :)
Je ne comprends toujours pas le dernier exemple. La surcharge de l'opérateur "=" dans la classe A transforme cette [0] de rvalue en lvalue... Je n'arrive pas à comprendre comment. S'agit-il d'une fonctionnalité de la MCL ? Il n'y a pas de tel comportement chez les pros.fxsaber, comment êtes-vous arrivé à cette construction ? Je veux dire surcharge = en A. Ou par essais et erreurs ?
 
On attribue au pointeur une valeur r, qui est ensuite écrasée par le nouveau A.
 
Комбинатор:
Le pointeur se voit attribuer rvalue, qui est ensuite écrasé par le nouveau A.

Où ? Ici ?

this[0] = new A ;

Ici, l'opérateur[] renvoie la valeur contenue dans la cellule Data[0]. Il ne s'agit pas d'une référence à cette cellule ou d'un pointeur vers celle-ci, mais simplement d'une copie de la valeur contenue dans cette cellule, c'est-à-dire rvalue. Rien ne peut être attribué à cette copie, bien sûr. Je ne comprends pas en quoi operator= change cela.

Raison: