Erreurs, bugs, questions - page 3102

 
Sergey Gridnev #:
Ce que vous voulez transmettre à fxsaber n'est pas très clair. Ce qui se passe exactement dans le code est quelque chose qu'il comprend sans vous. Il ne fait que montrer une situation qui ne devrait pas exister. Le compilateur devrait supprimer ces conversions.
C'est un point discutable. Sans ces conversions, vous risquez d'avoir de gros problèmes dans certains endroits. De plus, même ces interdictions du compilateur peuvent être contournées - il y a beaucoup de moyens dans le forum.
 
mktr8591 #:

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

La liste d'initialisation est le seul moyen légal (et spécifiquement prévu) d'initialiser des constantes non statiques.

 
Andrei Trukhanovich #:

La liste d'initialisation est le seul moyen légal (et spécifiquement prévu) d'initialiser des constantes non statiques.

Donc il a changé sa valeur après

 
A100 #:

Il a donc changé son sens après coup.

Oui, inattentif. Bug ? Les caractéristiques de la liste d'initialisation doivent s'appliquer uniquement à l'objet en cours de construction.

 
Andrei Trukhanovich #:

Oui, inattentif. Bug ? Les caractéristiques de la liste d'initialisation ne doivent être pertinentes que pour l'objet en cours de construction.

Bug. Je ne l'ai pas compris non plus au début. C'est pourquoi je dis que vous devez l'écrire de manière à ce que la plupart des gens le comprennent. Ceci s'applique également à l'interface

 
A100 #:

Bug. Je ne l'ai pas compris tout de suite non plus. C'est pourquoi je dis que vous devez l'écrire de manière à ce que la grande majorité des gens le comprennent. Cela s'applique également à l'interface.

Je suis d'accord sur les rapports de bogues, bien sûr.

L'interface est une autre histoire. Exemple :

Si un pilote, qui sait parfaitement piloter un avion, passe à un autre type d'avion avec un système de contrôle différent, sans étudier les manuels, il ne comprendra pas grand-chose.

Il est impossible de réaliser une interface complexe que même la plupart des professionnels peuvent comprendre sans étudier la documentation.

 
C'est une erreur de compilation :
class T {};                          //(1)
template<typename T> void f( T* ) {} //(2) Error: 'T' - identifier already used
Et si vous échangez :
template<typename T> void f( T* ) {} //(2)
class T {};                          //(1)

c'est bon. Quelle est la différence fondamentale ?

 
Bonjour à tous ! J'ai récemment commencé à m'entraîner sur un compte de démonstration. Aujourd'hui j'ai ouvert : Help - MQL5web-terminal. Après cela, la plateforme de trading a cessé de se charger. Lorsque je l'ai fait, il s'est avéré que mon compte de démonstration avait été effacé avec toutes les analyses techniques que j'y avais formées. J'ai dû ouvrir un nouveau compte. Pourquoi cela s'est-il produit ? Cela arrive-t-il à des comptes réels ?
 
mktr8591 #:

Dans b3095, je lance un script :

Si vous supprimez la surcharge f1(T* & Ptr), les 5 appels retournent void f1<const X>(const X*const).

C'est une sorte de fonctionnalité ?

Je voulais écrire cette contradiction en 3 lignes, mais ça n'a pas marché d'un coup

 

Je voudrais clarifier une question. Ce qui m'intéresse le plus, c'est de savoir pourquoi le motif (T* const) est sélectionné dans ces 2 lignes ?

Doit-il fonctionner avec un motif (T* &) ?

   f1<const X>((const X*) Ptr);           //void func_902::f1<const X>(const X*const)

   f1<const X>((X*)Ptr);                  //void func_902::f1<const X>(const X*const)
 


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

Erreurs, bogues, questions

mktr8591, 2021.11.03 15:43

Dans b3095, exécutez le script :

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;
  }

Si vous supprimez la surcharge f1(T* & Ptr), les 5 appels retournent void f1<const X>(const X*const).

C'est une sorte de fonctionnalité ?