MQL5 编译器不区分类和它的指针 - 页 6

 
Alexey Navoykov:

隐含地将这个指针转换为一个对象

正确的名称是 "隐式指针解读"。

我支持不允许的建议,只在引用类成员 时留下隐含的解引用,比如。

m_a.foo()
 
Alexey Navoykov:

这里的情况正好相反--指针被隐式地投给一个 对象(取消引用),然后对其应用operator=。 fxsaber昨天也提到了这一点。

虽然在逻辑上它与MQL规则不矛盾(因为调用operator=等同于调用任何其他对象方法),但它导致在理解这种代码时的模糊性和难以发现的错误。这不仅涉及到operator=,而且还涉及到==和!=。 也许这样的铸造也应该被禁止用于其他运算符,因为在C++中你可以应用到运算符:+-<>[]。

简短的结论是:当把C++中允许用于指针的操作符应用于一个指针时,禁止把这个指针隐含地铸造为一个对象。 相应地,上面的例子会有一个编译错误

是的,我明白了。通过这些简单的例子,我想告诉所有的怀疑者,指针和对象是不同的实体,人们不能把它们混为一谈。

而这种情况下,至少需要有一定的写代码的风格,这样你就不会犯错,构建出的代码可以编译,甚至可以通过测试,但在实际情况下会失败,如果是为了销售而写的,那就更糟了。在一切都如此 "隐含 "的情况下,要在代码中找到一个错误点并不是一件容易的事。

 
SemenTalonov:

在一切都如此 "隐性 "平等的代码中找到一个错误的地方将是一个相当大的挑战。

是的,他们有点太含蓄了。
 

如果开发商让事情保持原样,那就更好了。如果他们现在又开始改变它的语言,一堆程序停止编译,甚至更糟糕的是,停止按预期工作,就会引起全世界的骚动。

在我看来,µl中的自动对象是一种简陋的东西,是功能有限的下指针(带有自动删除功能的常量指针),而且它们大多根本不需要使用(除了垃圾收集器)。

 
Ilya Malev:

如果开发商让事情保持原样,那就更好了。如果他们现在又开始改变语言,一堆程序停止编译,或者更糟糕的是,停止按预期工作,就会引起全世界的骚动。

这里的变化是最小的。这只是一个将编译规则添加到

#property strict

这样,它就不允许编译现在被认为是好的垃圾。

 
SemenTalonov:

这样,它就不会让你编造那种现在被认为是好的异端。

如A a = new A?或者到底是什么)现在大家都在用,所以根本没有影响。

但是如果你写A a, *b = a; 你会得到一个运行时错误,在这种情况下,编译器必须明确地产生警告 "可能使用未初始化的变量'b'",就像它对所有其他类型所做的那样。如果根本不是一个编译错误。但不是因为赋值本身,而是因为在一个未初始化的变量上使用了一个重载函数,当然会引起运行时错误。这确实是一个错误,似乎与过度的代码优化有关。

而在一般情况下,将自动分配给迪诺,反之亦然,这些可能是有用的功能,并没有什么异端。

但我将完全取消对象的隐式复制这种东西。尽管它是C++中的一个标准。这实际上是所有这些麻烦的原因。
 
Ilya Malev:

如A a = new A?或者到底是什么 )

嗯,这不用说了。这里有一个内存泄漏。

Ilya Malev:

但总的来说,把自动分配给迪诺,反之亦然,这些可能是有用的功能,并没有什么异端。

随它去吧。但很明确。而这不是因为我的错误,而是因为我必须这样做。

 
SemenTalonov:

嗯,那是必然的。这里有一个内存泄漏。

好吧,这个泄漏纯粹是你的错。 如果你在左边有一个对象,你为什么要写这样一个结构?

但是相反的情况,当你给一个指针赋值时,它突然被取消引用,这是一个不明显的错误。

这里的一切都混杂在一起,既有苍蝇也有肉片。我说的是对这个话题的讨论。

 
Alexey Navoykov:

如果你在左边有一个物体,为什么要写这样一个结构?

人的因素!编译器应该把它保持在最低限度。

 
SemenTalonov:

人的因素!编译器应该把它保持在最低限度。

所以你建议完全禁止指针的隐式解除引用? 我想这里的很多人不会对此感到高兴。