MQL5 编译器不区分类和它的指针 - 页 6 12345678910111213 新评论 Ilya Baranov 2019.01.11 15:38 #51 Alexey Navoykov:隐含地将这个指针转换为一个对象正确的名称是 "隐式指针解读"。 我支持不允许的建议,只在引用类成员 时留下隐含的解引用,比如。 m_a.foo() SemenTalonov 2019.01.11 18:02 #52 Alexey Navoykov:这里的情况正好相反--指针被隐式地投给一个 对象(取消引用),然后对其应用operator=。 fxsaber昨天也提到了这一点。 虽然在逻辑上它与MQL规则不矛盾(因为调用operator=等同于调用任何其他对象方法),但它导致在理解这种代码时的模糊性和难以发现的错误。这不仅涉及到operator=,而且还涉及到==和!=。 也许这样的铸造也应该被禁止用于其他运算符,因为在C++中你可以应用到运算符:+-<>[]。 简短的结论是:当把C++中允许用于指针的操作符应用于一个指针时,禁止把这个指针隐含地铸造为一个对象。 相应地,上面的例子会有一个编译错误。是的,我明白了。通过这些简单的例子,我想告诉所有的怀疑者,指针和对象是不同的实体,人们不能把它们混为一谈。 而这种情况下,至少需要有一定的写代码的风格,这样你就不会犯错,构建出的代码可以编译,甚至可以通过测试,但在实际情况下会失败,如果是为了销售而写的,那就更糟了。在一切都如此 "隐含 "的情况下,要在代码中找到一个错误点并不是一件容易的事。 Alexey Navoykov 2019.01.11 18:43 #53 SemenTalonov:在一切都如此 "隐性 "平等的代码中找到一个错误的地方将是一个相当大的挑战。 是的,他们有点太含蓄了。 Ilya Malev 2019.01.12 14:20 #54 如果开发商让事情保持原样,那就更好了。如果他们现在又开始改变它的语言,一堆程序停止编译,甚至更糟糕的是,停止按预期工作,就会引起全世界的骚动。在我看来,µl中的自动对象是一种简陋的东西,是功能有限的下指针(带有自动删除功能的常量指针),而且它们大多根本不需要使用(除了垃圾收集器)。 SemenTalonov 2019.01.12 15:02 #55 Ilya Malev:如果开发商让事情保持原样,那就更好了。如果他们现在又开始改变语言,一堆程序停止编译,或者更糟糕的是,停止按预期工作,就会引起全世界的骚动。这里的变化是最小的。这只是一个将编译规则添加到 #property strict 这样,它就不允许编译现在被认为是好的垃圾。 Ilya Malev 2019.01.12 16:31 #56 SemenTalonov:这样,它就不会让你编造那种现在被认为是好的异端。如A a = new A?或者到底是什么)现在大家都在用,所以根本没有影响。但是如果你写A a, *b = a; 你会得到一个运行时错误,在这种情况下,编译器必须明确地产生警告 "可能使用未初始化的变量'b'",就像它对所有其他类型所做的那样。如果根本不是一个编译错误。但不是因为赋值本身,而是因为在一个未初始化的变量上使用了一个重载函数,当然会引起运行时错误。这确实是一个错误,似乎与过度的代码优化有关。而在一般情况下,将自动分配给迪诺,反之亦然,这些可能是有用的功能,并没有什么异端。 但我将完全取消对象的隐式复制这种东西。尽管它是C++中的一个标准。这实际上是所有这些麻烦的原因。 SemenTalonov 2019.01.12 17:49 #57 Ilya Malev:如A a = new A?或者到底是什么 )嗯,这不用说了。这里有一个内存泄漏。 Ilya Malev:但总的来说,把自动分配给迪诺,反之亦然,这些可能是有用的功能,并没有什么异端。 随它去吧。但很明确。而这不是因为我的错误,而是因为我必须这样做。 Alexey Navoykov 2019.01.12 17:54 #58 SemenTalonov:嗯,那是必然的。这里有一个内存泄漏。好吧,这个泄漏纯粹是你的错。 如果你在左边有一个对象,你为什么要写这样一个结构? 但是相反的情况,当你给一个指针赋值时,它突然被取消引用,这是一个不明显的错误。 这里的一切都混杂在一起,既有苍蝇也有肉片。我说的是对这个话题的讨论。 SemenTalonov 2019.01.12 17:55 #59 Alexey Navoykov:如果你在左边有一个物体,为什么要写这样一个结构?人的因素!编译器应该把它保持在最低限度。 Alexey Navoykov 2019.01.12 18:01 #60 SemenTalonov:人的因素!编译器应该把它保持在最低限度。 所以你建议完全禁止指针的隐式解除引用? 我想这里的很多人不会对此感到高兴。 12345678910111213 新评论 您错过了交易机会: 免费交易应用程序 8,000+信号可供复制 探索金融市场的经济新闻 注册 登录 拉丁字符(不带空格) 密码将被发送至该邮箱 发生错误 使用 Google 登录 您同意网站政策和使用条款 如果您没有帐号,请注册 可以使用cookies登录MQL5.com网站。 请在您的浏览器中启用必要的设置,否则您将无法登录。 忘记您的登录名/密码? 使用 Google 登录
隐含地将这个指针转换为一个对象
正确的名称是 "隐式指针解读"。
我支持不允许的建议,只在引用类成员 时留下隐含的解引用,比如。
这里的情况正好相反--指针被隐式地投给一个 对象(取消引用),然后对其应用operator=。 fxsaber昨天也提到了这一点。
虽然在逻辑上它与MQL规则不矛盾(因为调用operator=等同于调用任何其他对象方法),但它导致在理解这种代码时的模糊性和难以发现的错误。这不仅涉及到operator=,而且还涉及到==和!=。 也许这样的铸造也应该被禁止用于其他运算符,因为在C++中你可以应用到运算符:+-<>[]。
简短的结论是:当把C++中允许用于指针的操作符应用于一个指针时,禁止把这个指针隐含地铸造为一个对象。 相应地,上面的例子会有一个编译错误。
是的,我明白了。通过这些简单的例子,我想告诉所有的怀疑者,指针和对象是不同的实体,人们不能把它们混为一谈。
而这种情况下,至少需要有一定的写代码的风格,这样你就不会犯错,构建出的代码可以编译,甚至可以通过测试,但在实际情况下会失败,如果是为了销售而写的,那就更糟了。在一切都如此 "隐含 "的情况下,要在代码中找到一个错误点并不是一件容易的事。
在一切都如此 "隐性 "平等的代码中找到一个错误的地方将是一个相当大的挑战。
如果开发商让事情保持原样,那就更好了。如果他们现在又开始改变它的语言,一堆程序停止编译,甚至更糟糕的是,停止按预期工作,就会引起全世界的骚动。
在我看来,µl中的自动对象是一种简陋的东西,是功能有限的下指针(带有自动删除功能的常量指针),而且它们大多根本不需要使用(除了垃圾收集器)。
如果开发商让事情保持原样,那就更好了。如果他们现在又开始改变语言,一堆程序停止编译,或者更糟糕的是,停止按预期工作,就会引起全世界的骚动。
这里的变化是最小的。这只是一个将编译规则添加到
这样,它就不允许编译现在被认为是好的垃圾。
这样,它就不会让你编造那种现在被认为是好的异端。
如A a = new A?或者到底是什么)现在大家都在用,所以根本没有影响。
但是如果你写A a, *b = a; 你会得到一个运行时错误,在这种情况下,编译器必须明确地产生警告 "可能使用未初始化的变量'b'",就像它对所有其他类型所做的那样。如果根本不是一个编译错误。但不是因为赋值本身,而是因为在一个未初始化的变量上使用了一个重载函数,当然会引起运行时错误。这确实是一个错误,似乎与过度的代码优化有关。
而在一般情况下,将自动分配给迪诺,反之亦然,这些可能是有用的功能,并没有什么异端。
但我将完全取消对象的隐式复制这种东西。尽管它是C++中的一个标准。这实际上是所有这些麻烦的原因。如A a = new A?或者到底是什么 )
嗯,这不用说了。这里有一个内存泄漏。
但总的来说,把自动分配给迪诺,反之亦然,这些可能是有用的功能,并没有什么异端。
随它去吧。但很明确。而这不是因为我的错误,而是因为我必须这样做。
嗯,那是必然的。这里有一个内存泄漏。
好吧,这个泄漏纯粹是你的错。 如果你在左边有一个对象,你为什么要写这样一个结构?
但是相反的情况,当你给一个指针赋值时,它突然被取消引用,这是一个不明显的错误。
这里的一切都混杂在一起,既有苍蝇也有肉片。我说的是对这个话题的讨论。
如果你在左边有一个物体,为什么要写这样一个结构?
人的因素!编译器应该把它保持在最低限度。
人的因素!编译器应该把它保持在最低限度。