エラー、バグ、質問 - ページ 1706

 
Комбинатор:

おっと、遅くなった、2つ目の例は全然正しくないな。

だからこそ、論理的に

error: 'int*' 型の rvalue からの 'int*&' 型の非恒等式参照の初期化が無効です。

はい、すでに上に書きました。2番目のサンプルを修正しましたが、まだうまくいきません。この演算子は値、つまりコピーを返します。3人とも鈍感になったんだろうなぁ、えーっ!))
 
Sergei Vladimirov:
3人とも、えーっ!というくらい間抜けでなければならなかった。))
では、なぜfxsaberの例の1枚目はうまくいくのでしょうか?
 
Комбинатор:
では、なぜfxsaberの例の1枚目が動作するのでしょうか?

なぜ、そうしないのか?彼はポインタを返す式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に...どうしたらいいのかわからない。これはMCLの機能の一種なのでしょうか、プロにはそのような動作はありません。fxsaber さん、どうやってこの構成にたどり着いたのでしょうか?オーバーロード=Aでという意味です。それとも試行錯誤で?
 
ポインタにはr値が割り当てられ、新しいAで上書きされます。