Erros, bugs, perguntas - página 1706

 
Комбинатор:

Oops, estou a abrandar, o segundo exemplo não está de todo certo.

É por isso que é lógico que

erro: inicialização inválida de referência não constante do tipo 'int*&' a partir de um valor do tipo 'int*'.

Sim, eu já escrevi sobre isso acima. Modifiquei a segunda amostra, mas ainda não funciona. O operador devolve um valor, ou seja, uma cópia. Todos nós os três devemos ter ficado tão obtusos, eh! ))
 
Sergei Vladimirov:
Nós os três tínhamos de ser tão burros, eh! ))
Então, porque é que a primeira peça do exemplo do fxsaber funciona?
 
Комбинатор:
Então porque é que a primeira peça do exemplo do fxsaber funciona?

Porque não deveria? Ele tem uma expressão isto[0] que devolve um ponteiro. Aqui é a mesma coisa de uma forma diferente:

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:
este[0] é o valor aqui.
Exactamente não é assim
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);
}


Resultado
2016.09.25 18:57:42.214 Test (RTS-12.16,M1)     5
O problema é um disparate.
void A::operator =( A* )
Infelizmente, o vocabulário é escasso para o explicar.
 
O problema é que o ponteiro (descritor) do valor de alguma forma se transforma em lvalue depois de ser atribuído a uma variável. É um pouco de loucura...
 

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

Результат

O problema é uma certa inutilidade

Infelizmente, o vocabulário é escasso para explicação.

OK, não me apetece pensar. Já cansado.

 
Комбинатор:
O problema é que o ponteiro (descritor) do valor de alguma forma se transforma em lvalue depois de ser atribuído a uma variável. Isso é um pouco de loucura...
Sim, sou eu quem está confuso. Depois de
    A* a = this[0];
    a = new A; // так работает

A expressão

CheckPointer(this[0]) == POINTER_INVALID

será verdade. O que faz todo o sentido.

Os criadores devem formular a razão pela qual é impossível de forma clara e agradável

this[0] = new A;
 
fxsaber:
Sim, eu fiz asneira.
Sim, fiquei confuso. Devia ter verificado antes de ter saltado a arma. Seja como for, está tudo bem :)
 
Комбинатор:
Em suma, é tudo bom :)
Ainda não compreendo o último exemplo. Sobrecarga "=" operador na classe A transforma isto[0] de valor em lvalue... Não consigo perceber como. Isto é algum tipo de característica do MCL, não existe tal comportamento nos profissionais.fxsaber, como chegou sequer a esta construção? Quero dizer sobrecarga = em A. Ou por tentativa e erro?
 
Ao ponteiro é atribuído um valor, que é depois sobregravado por um novo A.