Fehler, Irrtümer, Fragen - Seite 1730

 
Ilyas:
Das ist richtig, hier in der Schreibweise, T = A *

Dann gibt es hier einen Kompilierungsfehler

template<typename T>
void f1( const T  const & a[] ) {} //error: 'const' - unexpected token
class A {};
void f2( const A* const & a[] ) {}
class B {
        void g1() const { f1( a ); }
        void g2() const { f2( a ); }
        A *a[];
};
 
Sergei Vladimirov:
Ganz genau. Ich habe all diese Behauptungen gelesen und kann immer noch nicht verstehen, wo das Problem liegt. Werden Sie diese Dateien auf einer Diskette speichern?


Nutzt es Ihre Festplatte ab, wenn Sie eine 100K-Datei anstelle einer 50K-Datei speichern? (Finden Sie das nicht komisch? )

Und ist es normal, dass wegen eines einzigen Copyright-Zeichens (das im Prinzip international ist und in allen Kodierungen vorkommt, auch wenn sein Code größer als 127 ist) die Dateigröße ohne jeden Sinn verdoppelt wird? Ist das nicht clever? Warum Dateien ohne Not um das 2fache aufblähen?

Nicht nur die Größe ist das Problem, sondern auch die kontextbezogene Suche. Solange die Dateien im ASCII-Format vorliegen, können Sie viele Programme von Drittanbietern, darunter auch Dateimanager, verwenden, um anhand der Kontextzeichenfolge nach Dateien zu suchen. Ich benutze es fast jeden Tag. Der systemeigene MQ-Editor ist in dieser Hinsicht genauso unzureichend wie in vielen anderen offensichtlichen Codierungsfragen. Sobald wir Unicode haben, hat die Kontextsuche zwei Probleme: nicht alle Programme können oder wollen dies tun, und für diejenigen, die es können, ergibt sich Punkt 2 - Langsamkeit.

Natürlich ist es für manche Menschen einfacher, zusätzlich zur Festplatte einen schnelleren Computer zu kaufen, als sich Gedanken darüber zu machen oder zumindest von anderen Produkten zu lernen, wie benutzerfreundlich und effizient Software sein sollte.

 
A100:

Dann gibt es hier einen Kompilierungsfehler

Auch in C++ gibt es eine Zweideutigkeit des Typs: const T const

Aber es gibt einen Ausweg - die Konstante nach rechts verschieben

template<typename T>
void f1(  T         const & a[] ) {} //error: 'const' - unexpected token
class A {};
void f2(  A const * const & a[] ) {} //нормально
class B {
        void g1() const { f1( a ); } //error: 'f1' - cannot to apply function template
        void g2() const { f2( a ); } //нормально
        A *a[];
};
C++ kompiliert ohne Fehler (unter Berücksichtigung des Syntaxunterschieds)
 
A100:

Auch in C++ gibt es eine Zweideutigkeit des Typs: const T const

Aber es gibt einen Ausweg - die Konstante nach rechts verschieben

C++ kompiliert ohne Fehler (angesichts des Syntaxunterschieds)

Aber logisch gesehen ist es seltsam, wenn "const A" und "A const" das Gleiche bedeuten.

Vielleicht ist"Aconst*" ein konstanter Zeiger auf ein Nicht-Konst-Objekt.

Dies scheint der Fall zu sein. Weil ein solches Konstrukt existiert.

class A {};
void f( const A const * const & a[] ) {}

Sie können den Zeiger nicht ändern, Sie können nicht per Verweis ändern und Sie können nicht das/die Objekt(e) ändern.

Könnte ein solches Konstrukt dem Compiler unter dem Gesichtspunkt, schnellen Code zu erhalten, einen geeigneten Hinweis geben?

 
Stanislav Korotky:

Ist es normal, dass ein einziges Copyright-Zeichen (das im Prinzip international ist und in allen Kodierungen vorkommt, obwohl sein Code größer als 127 ist) dazu führt, dass sich die Dateigröße um das Zweifache erhöht...

Ja. Im Grunde genommen sehe ich keinen Sinn darin, bei Spielen zu sparen.
 
Es ist interessant, dass in dieser Konstruktion
class A {};
void f( const A const * & a[] ) {}

Sie können die Elemente nicht ändern, aber Sie können die Größe des Arrays ändern.

Lustig ist, dass die Methoden wie folgt aussehen können

class A {};
class B
{
  const A const * Method( const A const * const & a[] ) const
  {
    return(a[0]);
  }
};
 
fxsaber:

Es ist möglich, dass"Aconst*" ein Zeiger auf eine Konstante und nicht auf ein konstantes Objekt ist.

Wenn es sich nicht um ein Muster handelt, ist "A const *" gleich "const A *", und wenn es sich um ein Muster handelt, bedeutet dies (in C++ )
 
A100:
Wenn es sich nicht um ein Muster handelt, ist "A const *" gleich "const A *", und wenn es sich um ein Muster handelt, dann durch die Situation
Es sollte also keine Gleichwertigkeit bestehen. MQL betrachtet es jedoch als gleichwertig
class A
{
public:
  int i;
};

void f( A const * & a[] )
{
  a[0].i = 1; // 'i' - constant cannot be modified
}
Meiner Meinung nach liegt hier ein Fehler vor. Denn es wird ein Array mit konstanten Zeigern (const *) übergeben, nicht ein Array mit Zeigern auf konstante Objekte(const A).
 
A100:
Speziell dies - in Zukunft behoben https://www.mql5.com/ru/forum/1111/page1749#comment_2892563
Dann sollte es keine Gleichwertigkeit in Ihrer Aussage geben
A100:
Wenn es sich nicht um ein Muster handelt, ist "A const *" gleich "const A *", und wenn es sich um ein Muster handelt - in diesem Fall (in C++ )
 
fxsaber:
Es ist interessant, dass bei einem Entwurf wie diesem...
class A {};
void f( const A const * & a[] ) {}

Elemente können nicht geändert werden, aber die Größe des Arrays kann geändert werden.

Wirklich? Das ist schade, so sollte es nicht sein.
Grund der Beschwerde: