Hatalar, hatalar, sorular - sayfa 3101

 

b3095'te betiği çalıştırıyorum:

 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) aşırı yüklemesini kaldırırsak, 5 çağrının tümü void f1<const X>(const X*const) döndürür.

Bir tür özellik mi?

 

Açıkla lütfen:

*1* satırı, beklendiği gibi bir derleyici hatası veriyor.

Ve *2* satırı derlenir ve düzgün çalışır. Niye ya?

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

Açıkla lütfen:

*1* satırı, beklendiği gibi bir derleyici hatası veriyor.

Ve *2* satırı derlenir ve düzgün çalışır. Niye ya?

Açık bir çelişki göstermeniz gerekir (const değerini değiştirdiğiniz):

 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 - не может быть
}
Ve tahmin etmek için deneyimli Kullanıcılar ve Geliştiriciler sunuyorsunuz
 
A100 # :

const değeri değişti

Ticaret, otomatik ticaret sistemleri ve ticaret stratejilerinin test edilmesi hakkında forum

Mql5 dilinin özellikleri, incelikleri ve çalışma yöntemleri

fxsaber , 2017.11.07 14:57

Bir const sınıfı nesnesinin alanlarını değiştirmek veya onun const olmayan yöntemlerini çağırmak mümkün müdür? -Yapabilir!
 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
}

Bu özelliği kendimde sevmiyorum. Yetkisiz erişime karşı sigortalı olduğunu sanıyordum. Ancak berbat! const yapıları ile bu, elbette, çalışmaz. Bu yüzden bu boşluğun farkında olun.


 
A100 # :

Açık bir çelişki göstermeniz gerekir (const değerini değiştirdiğiniz):

Ve tahmin etmek için deneyimli Kullanıcılar ve Geliştiriciler sunuyorsunuz
Bu kadar detaya girmek aklıma gelmemişti...
 
fxsaber # :
Evet. Ancak örneğinizde, const T'nin T'ye açık bir (f-th aracılığıyla) dönüşümüne sahipsiniz - yani. "yasallaştırılmış" boşluk.
 
mktr8591 # :
Evet. Ancak örneğinizde, const T'nin T'ye açık bir (f-th aracılığıyla) dönüşümüne sahipsiniz - yani. "yasallaştırılmış" boşluk.
((A*)(&a)).i = 1 ;    
 
fxsaber # :
benzer şekilde - (const A*) A*'a dönüştürün.
 
mktr8591 # :
benzer şekilde - (const A*) A*'a dönüştürün.
((A)a).i = 1 ;
 
fxsaber # :

Örneğinizde, const'ın const olmayana açık bir dönüşümü ve orada her şey saf