오류, 버그, 질문 - 페이지 1706

 
Комбинатор :

오, 나는 속도를 늦추고 있어, 두 번째 예는 일반적으로 틀리다

따라서 논리적입니다.

오류: 'int*' 유형의 rvalue에서 'int*&' 유형의 비 const 참조 초기화가 잘못되었습니다.

예, 나는 이미 위에서 이것에 대해 썼습니다. 두 번째 예를 변경했지만 여전히 작동하지 않습니다. 연산자는 값을 반환합니다. 복사. 뭐, 셋 다 그렇게 무뚝뚝할 필요는 있었어, 응! ))
 
Sergei Vladimirov :
뭐, 셋 다 그렇게 무뚝뚝할 필요는 있었어, 응! ))
그렇다면 fxsaber 예제의 첫 번째 부분이 작동하는 이유는 무엇입니까?
 
Комбинатор :
그렇다면 fxsaber 예제의 첫 번째 부분이 작동하는 이유는 무엇입니까?

그러면 안되는 이유는 무엇입니까? this[0] 표현식은 포인터를 반환합니다. 다음은 다른 형식으로 동일합니다.

 int a;

int * Func( int & i)
{
   return (&i);
}

int * p = Func(a);   // работает, то же что A* a = this[0]
Func(a) = new int ;   // не работает, то же, что и this[0] = new int
 
Sergei Vladimirov :
this[0]은 rvalue입니다.
그냥 안 맞아
 class A
{
public :    
   int Tmp;
  
   void operator =( A* )
  {
  }

   void operator =( const int Value )
  {
     this .Tmp = Value;
  }
};

class B
{
public :  
  A* Data[];
  
  B()
  {
     ArrayResize ( this .Data, 1 );
  }

  A* operator []( const int Pos )
  {
     return ( this .Data[Pos]);
  }
  
   void Init()
  {
     // this[0] = new A; // ошибка выполнения: invalid pointer access
     this .Data[ 0 ] = new A;
    
     this [ 0 ] = 5 ; // this[0] - НЕ rvalue
  } 
};

void OnStart ()
{
  B b;
  
  b.Init();
  
   Print (b[ 0 ].Tmp);
}


결과
 2016.09 . 25 18 : 57 : 42.214 Test (RTS- 12.16 ,M1)     5
문제는 약간의 무감각
 void A:: operator =( A* )
불행히도, 어휘는 설명하기가 열악합니다.
 
문제는 어떤 이유로 rvalue의 포인터(설명자)가 변수에 할당된 후 lvalue로 변한다는 것입니다. 망상...
 

fxsaber :
Точно не так

Результат

문제는 약간의 무감각

불행히도, 어휘는 설명하기가 열악합니다.

알았어, 생각하지마. 피곤해.

 
Комбинатор :
문제는 어떤 이유로 rvalue의 포인터(설명자)가 변수에 할당된 후 lvalue로 변한다는 것입니다. 망상...
네, 제가 망쳤습니다. 후에
    A* a = this [ 0 ];
    a = new A; // так работает

표현

 CheckPointer ( this [ 0 ]) == POINTER_INVALID

사실이 될 것입니다. 완전히 논리적입니다.

그리고 개발자들이 불가능에 대한 이유를 명확하고 아름답게 공식화하면 좋을 것입니다.

 this [ 0 ] = new A;
 
fxsaber :
네, 제가 망쳤습니다.
예, 붙어 있습니다. 난감함에 돌진하기 전에 확인이 필요했다. 간단히 말해서 모든 것이 좋습니다. :)
 
Комбинатор :
간단히 말해서 모든 것이 좋습니다. :)
나는 아직도 마지막 예를 이해하지 못한다. 클래스 A에서 "=" 연산자를 오버로딩하면 this[0]이 rvalue에서 lvalue로 바뀝니다... 방법을 알 수 없습니다. 이것들은 MKL의 일부 기능이며 프로에는 그러한 동작이 없습니다. fxsaber , 어떻게 이 디자인을 추측했습니까? 과부하 = A를 의미합니다. 아니면 무작위로?
 
포인터에 rvalue가 할당된 다음 새 A로 덮어씁니다.