错误、漏洞、问题 - 页 1706

 
Комбинатор:

哎呀,我慢下来了,第二个例子根本就不对。

这就是为什么符合逻辑的是

错误:从'int*'类型的r值初始化'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]是这里的r值。
确切地说,不是这样的
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的某种特性,在专业术语中没有这种行为。我的意思是过载=在A。还是通过试验和错误?
 
指针被分配一个r值,然后被新的A所覆盖。