Fehler, Irrtümer, Fragen - Seite 3101

 

In b3095 führe ich ein Skript aus:

template <typename T>
void f1(T* const Ptr) {Print(__FUNCSIG__);}

template <typename T>
void f1(T* & Ptr) {Print(__FUNCSIG__);}


class X {};

void OnStart()
  {
//---
   const X* Ptr = new X;
   
   f1(Ptr);                               //void f1<const X>(const X*&)
   f1<const X>(Ptr);                      //void f1<const X>(const X*&)
   
   //дальше непонятно!
   f1<const X>((const X*) Ptr);           //void func_902::f1<const X>(const X*const)
   f1<const X>((const X* const) Ptr);     //void func_902::f1<const X>(const X*const)
   f1<const X>((X*)Ptr);                  //void func_902::f1<const X>(const X*const)
 
   delete Ptr;
  }

Wenn Sie die Überladung f1(T* & Ptr) entfernen, geben alle 5 Aufrufe void f1<const X>(const X*const) zurück.

Ist dies eine Art Funktion?

 

Bitte erläutern Sie dies:

Zeile *1* gibt einen Compilerfehler - erwartet.

Aber Zeile *2* kompiliert und funktioniert einwandfrei. Und warum?

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 #:

Bitte erläutern Sie dies:

Zeile *1* gibt einen Compilerfehler - erwartet.

Aber Zeile *2* kompiliert und funktioniert einwandfrei. Und warum?

Sie müssen einen klaren Widerspruch aufzeigen (dass Sie den Konstantenwert geändert haben):

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 - не может быть
}
Und Sie schlagen vor, dass sowohl erfahrene Benutzer als auch Entwickler raten sollten
 
A100 #:

Wertänderung

Forum zum Thema Handel, automatisierte Handelssysteme und Testen von Handelsstrategien

Merkmale der Sprache mql5, Feinheiten und Tricks

Meine Idee ist es, mql5 als Forex-Handelssystem zu verwenden, und ich würde es gerne in meiner eigenen Praxis einsetzen.

Ist es möglich, die Felder eines const-Objektseiner Klasse zu ändern oder seine Nicht-const-Methoden aufzurufen? -Sie können!
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
}

Ich selbst mag diesen Chip nicht. Ich dachte, ich sei gegen unbefugten Zugriff versichert. Trotzdem schade! Das funktioniert natürlich nicht mit konstanten Strukturen. Behalten Sie dieses Schlupfloch also im Hinterkopf.


 
A100 #:

Sie müssen einen klaren Widerspruch aufzeigen (dass Sie den Wert von const geändert haben):

Und Sie schlagen vor, dass sowohl erfahrene Benutzer als auch Entwickler raten
Ich hätte nicht gedacht, dass ich es so detailliert beschreiben könnte...
 
fxsaber #:
Ja. Aber in Ihrem Beispiel haben Sie eine explizite (über eine Funktion) Umwandlung von const T in T - also ein "legalisiertes" Schlupfloch.
 
mktr8591 #:
Ja. Aber in Ihrem Beispiel haben Sie eine explizite (über eine Funktion) Umwandlung von const T in T - also ein "legalisiertes" Schlupfloch.
((A*)(&a)).i = 1;    
 
fxsaber #:
ähnlich - (const A*) in A* umwandeln.
 
mktr8591 #:
ähnlich - (const A*) in A* umwandeln.
((A)a).i = 1;
 
fxsaber #:

In Ihrem Beispiel wird const explizit in non const umgewandelt, und schon ist es sauber