エラー、バグ、質問 - ページ 3101

 

b3095ではスクリプトを実行しています。

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

オーバーロード f1(T* & Ptr) を削除すると,5コールとも void f1<const X>(const X*const) を返します.

これは何かの機能なのでしょうか?

 

説明してください。

1*行目でコンパイラーエラーが発生する - 予想通り。

しかし、行*2*はコンパイルして問題なく動作します。なぜ?

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

説明してください。

1*行目でコンパイラーエラーが発生する - 予想通り。

しかし、行*2*はコンパイルして問題なく動作します。なぜ?

明確な矛盾(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 - не может быть
}
そして、経験豊富なユーザーと開発者の両方が推測 することを提案しています。
 
A100 #:

バリューチェンジ

トレーディング、自動売買システム、トレーディング戦略のテストに関するフォーラム

mql5言語の特徴、微妙なニュアンスとコツ

私の 考えは、mql5をFXの取引システムとして、自分の練習に使いたい。

クラスの constオブジェクトの フィールドを変更したり、その const でないメソッドを呼び出したりすることは可能ですか?-できる!
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
}

私はこのチップは好きではありません。不正アクセスに対する保険に加入していると思っていた。悔しいけど!もちろん、const構造ではうまくいきません。だから、この抜け道は覚えておいてほしい。


 
A100 #:

明確な矛盾(constの値を変更したこと)を示す必要があります。

そして、経験豊富なユーザーの推測と 開発者の両方が提案します。
こんなに細かく描写するとは思わなかった...。
 
fxsaber #:
しかし、この例では、const TをTに明示的に(関数で)変換しています。つまり、「合法化」された抜け道です。
 
mktr8591 #:
しかし、この例では、const TをTに明示的に(関数で)変換しています。つまり、「合法化」された抜け道です。
((A*)(&a)).i = 1;    
 
fxsaber #:
同様に - (const A*) A* に変換する。
 
mktr8591 #:
同様に - (const A*) A* に変換する。
((A)a).i = 1;
 
fxsaber #:

あなたの例では、明示的にconstをnon constに変換しています。