Ошибки, баги, вопросы - страница 1706

 
Комбинатор:

Ой, торможу, второй пример вообще неправильный

Поэтому логично что:

error: invalid initialization of non-const reference of type 'int*&' from an rvalue of type 'int*'

Да, я выше уже написал об этом. Я изменил второй пример, но он всё равно не работает. Оператор же возвращает значение, т.е. копию. Это ж надо было так всем троим затупить, а! ))
 
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

будет true. Что полностью логично.

А так хорошо бы разработчикам четко и красиво сформулировать причину невозможности

this[0] = new A;
 
fxsaber:
Да это я запутал.
Да, затупил. Надо было проверить перед тем как на амбразуры бросаться. Короче все хорошо :)
 
Комбинатор:
Короче все хорошо :)
А я так и не понял последнего примера. Перегрузка оператора "=" в классе А превращает this[0] из rvalue в lvalue... Не могу понять, как. Это какие-то особенности МКЛ, в плюсах такого поведения нет. fxsaber, вы как, вообще, догадались до этой конструкции? Я имею в виду перегрузку = в А. Или методом тыка?
 
Указателю присваивается rvalue, которое потом затирается new A.
Причина обращения: