오류, 버그, 질문 - 페이지 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 언어의 특징, 미묘함 및 작업 방법

fxsaber , 2017.11.07 14:57

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로의 명시적(f번째를 통해) 변환이 있습니다. "합법화된" 허점.
 
mktr8591 # :
네. 그러나 귀하의 예에서는 const T에서 T로의 명시적(f번째를 통해) 변환이 있습니다. "합법화된" 허점.
((A*)(&a)).i = 1 ;    
 
fxsaber # :
유사하게 - (const A*) A*로 변환합니다.
 
mktr8591 # :
유사하게 - (const A*) A*로 변환합니다.
((A)a).i = 1 ;
 
fxsaber # :

귀하의 예에서 const를 non const로 명시적으로 변환하면 모든 것이 순수 합니다.