Erreurs, bugs, questions - page 3101

 

Veuillez expliquer :

La ligne *1* donne une erreur de compilation - attendue.

Mais la ligne *2* compile et fonctionne bien. Pourquoi ?

int f(int & p) {return p;}

class X
  {
public:
   const int         i;
                     X(){}
        /*1*/      //X(X& x) : i(f(x.i)) {f(x.i);}  //'i' - constant variable cannot be passed as reference
        /*2*/        X(X& x) : i(f(x.i)) {}          //OK
  };

void OnStart()  {}
 
mktr8591 #:

Veuillez expliquer :

La ligne *1* donne une erreur de compilation - attendue.

Mais la ligne *2* compile et fonctionne bien. Pourquoi ?

Vous devez démontrer une contradiction claire (que vous avez changé de valeur de const) :

int f( int &p ) { return p = !p; }
struct X {
        const int i;
        X( int i ) : i( i )      {}
        X( X& x  ) : i( f(x.i) ) {}
};
void OnStart()
{
        X x1( 1 );
        const int i =  x1.i;
                                { X x2 = x1; }
        Print(    i == x1.i );  //Результат: false - не может быть
}
Et vous suggérez que les utilisateurs et les développeurs expérimentés devraient deviner...
 
A100 #:

changement de valeur

Forum sur le trading, les systèmes de trading automatisés et les tests de stratégies de trading

Caractéristiques du langage mql5, subtilités et astuces

Mon idée est d'utiliser mql5 comme système de trading forex, et j'aimerais l'utiliser dans ma propre pratique.

Est-il possible de modifier les champsd'un objet constantd'une classe ou d'appeler ses méthodes non constantes ? -Tu peux !
template <typename T>
T GetMe( const T Ptr )
{
  return((T)Ptr);
}

class A
{
public:  
  int i;
};

void OnStart()
{
  const A a;

  GetMe(&a).i = 1;
  
  Print(a.i); // 1
}

Je n'aime pas cette puce moi-même. Je pensais être assuré contre les accès non autorisés. Mais c'est dommage ! Cela ne fonctionne pas avec les structures constantes, bien sûr. Gardez donc cette échappatoire à l'esprit.


 
A100 #:

Vous devez montrer une contradiction claire (que vous avez changé la valeur de const) :

Et vous suggérez que les utilisateurs expérimentés devinent et les développeurs
Je n'ai pas pensé à le décrire avec autant de détails...
 
fxsaber #:
Oui. Mais dans votre exemple, vous avez une conversion explicite (via une fonction) de const T en T - c'est-à-dire une faille "légalisée".
 
mktr8591 #:
Oui. Mais dans votre exemple, vous avez une conversion explicite (via une fonction) de const T en T - c'est-à-dire une faille "légalisée".
((A*)(&a)).i = 1;    
 
fxsaber #:
de manière similaire - (const A*) convertir en A*.
 
mktr8591 #:
de manière similaire - (const A*) convertir en A*.
((A)a).i = 1;
 
fxsaber #:

Votre exemple convertit explicitement les const en non const, et c 'est propre.

 
mktr8591 #:
de manière similaire - (const A*) convertir en A*.
Ce que vous voulez transmettre à fxsaber n'est pas très clair. Il comprend exactement ce qui se passe dans le code sans vous. Ça vous montre juste une situation qui ne devrait pas exister. Le compilateur devrait empêcher de telles conversions.