错误、漏洞、问题 - 页 2521

 

fxsaber:
Подскажите, как в C++  с этим? Задумался, использовать эту фишку в своем коде или нет. Если в C++ работает, буду использовать. Нет - вряд ли, т.к. могут отменить в следующих билдах.

b = a; 
a = b; // OK

第一个任务只在MQL中起作用。而且太糟糕了,它是有效的。 我希望他们最终能废除这个误解。 第二个没有问题。

 
Alexey Navoykov:

第一个任务只在MQL中工作。我希望他们最终能取消这个误会。 我对第二个没有问题。

这很奇怪。我以为第一种方法一定有效,而第二种方法则无效。

 
fxsaber:

这很奇怪。我以为第一种方法一定有效,而第二种方法则无效。

嗯,显然,MQL的开发者们也不太理解赋值的本质。因为我已经告诉他们这个问题很长时间了,但却碰了壁。

赋值的本质是为对象分配一个等价的 对象。这意味着右边的对象首先被隐含地投递到左边对象的类型中,然后才进行赋值(复制)。 而在第一种情况下,这种投递(A->B)肯定是不可能的。在C++中会有一个错误,但在MQL中,左边的对象被投到右边的对象,A::operator=(A&)被执行,只替换了b对象的一部分。 这是一个分配吗?

想象一下,你正在将int赋值给long,但只有前四个字节被替换,其余的没有被触动。 这里也是如此。

 
Alexey Navoykov:

想象一下,你把一个int赋值给一个long,但只有前四个字节被替换,其余的都没有动过。 这里也是一样。

所以它很方便,我想。当然,是在结构的范围内。

 
fxsaber:

所以它很方便,似乎。当然,是在结构的范围内。

它可能会在字符串中保存字符,但它是随机错误的来源,并使对代码的理解变得复杂/扭曲。正如上面所说的,等号有一个明确无误的含义,即整个 对象被改变。 这就是为什么在这种情况下,操作符没有按照预期使用。 如果你想要这种非标准行为,你应该为这种目的重载操作符。

p.s. 唯一的例外是,如果类B没有自己的字段,也就是说,它和类A完全一样(完全等同于它),那么就没有理由阻止这种赋值,尽管它在C++中无论如何都是不起作用的,但在MQL中你可以允许它。

 
Slava:

在opt文件中,在规定了所有输入参数的大块中,优化参数的值(通过大小和偏移量字段定义)不包含Value(如同没有优化),而是包含Start。

在那里设置 "价值 "是符合逻辑的。

 
Alexey Navoykov:

好吧,看来MQL开发人员也不太理解赋值的本质。因为我已经告诉他们这个问题很长时间了,但却碰了壁。

赋值的本质是为对象分配一个等价的 对象。换句话说,属于同一类型。

用户类型的操作的本质没有事先定义。而且只定义了它们的顺序,在这种情况下,它包括调用适当的操作符=。

在MQL中,与C++不同,operator=是继承的,所以b = a; 等于调用A::operator=(const A&)。

一般来说,这里不存在矛盾。在分配等价物的特殊情况下,有一些实体的不一致,但也不过如此

 
A100:

在MQL中,与C++不同,operator=是继承的,所以b = a;等同于调用b.operator=(const A&)。

嗯,是的,这就是问题所在。但写作上的差异在这里并不起作用。 在C++中,这两种情况下都不会编译。

一般来说,这里不存在矛盾。在分配同等对象的特殊情况下,存在一些实体的不一致情况

至少在C++中会有矛盾。 如果它能编译,就意味着右操作数被隐含地转换为左操作数,然后对对象进行完整的替换,这在逻辑上应该是可行的。 我举了一个int->long的例子。 而对对象内部的部分替换并不是赋值。 所以既有矛盾也有不一致的地方。

p.s. 虽然我们也可以重载操作符B::operator=(A&),但我想一个明智的程序员会在那里完全替换B对象,而不是部分替换,因为这是赋值的本质。

如果想要简洁的拼写,可以为其制作一些其他的运算符:例如&=或|=。 至少它们不常用,所以不会产生混淆。

[删除]  
Alexey Navoykov:

..........

矛盾的是,至少与C++。......

..........

是什么让你认为MQL必须完全等同于C++呢?

C-like并不意味着等同于!

MQL是为明确的任务而开发的,没有义务完全复制它所依据的语言。

你能不能不要再愤愤不平了?

但在Pascal中,你可以.........

在Assembler中,你可以进入.....

而在Java ....

而在BASIC ....

你在这里练习比较语言吗?

=======

P.S. 不仅仅是你...

 
Сергей Таболин:

是什么让你认为MQL应该与C++完全兼容呢?

...

你在这里练习比较语言吗?

我是在回应一个具体的短语。冷静下来。吃点缬草,然后去睡觉。 担心对你没有好处。...有些人一听到 "C++"这个词就会热血沸腾。