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

 

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

b = a; 
a = b; // OK

最初の割り当ては、MQLでのみ機能します。しかも、それがうまくいっているのが残念。 この誤解を最終的に廃止してほしい。 2枚目には何の問題もない。

 
Alexey Navoykov:

最初の割り当ては、MQLでのみ機能します。最終的にこの誤解を解いてほしい。 2作目でも問題ない。

それは変ですね。1つ目はうまくいって、2つ目はうまくいかないに違いないと思っていました。

 
fxsaber:

それは変ですね。1つ目はうまくいって、2つ目はうまくいかないに違いないと思っていました。

どうやら、MQLの開発者たちも、代入の本質をよく理解していないようだ。この問題をずっと伝えてきたのに、壁にぶち当たってしまうからです。

割り当ての本質は、オブジェクトに等価な オブジェクトを割り当てることである。つまり、右のオブジェクトを左のオブジェクトの型に暗黙のうちにキャストして、初めて代入(コピー)が行われる。 そして、最初のケースでは、このようなキャスト(A->B)は確かに不可能である。C++ではエラーになりますが、MQLでは左のオブジェクトを右のオブジェクトにキャストしてA::operator=(A&)を実行し、bオブジェクトの一部だけを置き換えています。 これは代入でしょうか?

intをlongに代入しているが、最初の4バイトだけが置き換えられ、残りはそのままになっていると想像してください。 ここも同じです。

 
Alexey Navoykov:

longにintを代入したとき、最初の4バイトだけが置換され、残りはそのままになることを想像してください。 ここも同じです。

だから、便利なんでしょうね。もちろん、構造物という意味では。

 
fxsaber:

だから便利なんだと思われます。もちろん、構造物という意味では。

文字列の保存は可能ですが、ランダムエラーの原因となり、コードの理解を複雑化・混乱させます。前述のように、等号はオブジェクト全体を 変更するという明確な意味を持っています。 そのため、この場合、演算子は意図したようには使われません。 このような非標準的な動作をさせたい場合は、その目的のために演算子をオーバーロードすべきです。

p.s. 唯一の例外は、クラスBがそれ自身のフィールドを持たない場合、つまり、クラスAとまったく同じ(完全に同等)である場合、この割り当てを妨げる理由はありません、C++ではとにかくうまくいきませんが、MQLでは許可できます。

 
Slava:

optファイルにおいて、すべての入力パラメータが規定されているチャンクでは、最適化されたパラメータ(sizeとoffsetフィールドで定義)の値には、(最適化しない場合と同様に)Valueではなく、Startが含まれています。

そこにバリューがあるのは、理にかなっていると思います。

 
Alexey Navoykov:

さて、MQLの開発者も、アサインメントの本質をよく理解していないようです。この問題をずっと伝えてきたのに、壁にぶち当たってしまうからです。

割り当ての本質は、オブジェクトに等価な オブジェクトを割り当てることである。つまり、同じ種類のものです。

ユーザータイプに対する操作の本質は、あらかじめ定義されていない。そして、その順番だけが定義されており、この場合、適切なoperator=を呼び出すことで成り立っています。

MQLでは、C++とは異なりoperator=が継承されるため、b = a;はA::operator=(constA&)を呼び出すことと同じになります。

一般的には、ここに矛盾はない。等価なオブジェクトを割り当てるという特殊なケースでは、エンティティの不整合はあるが、それ以上のことはない

 
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では...................できるのです。

アセンブラでは、............................です。

そして、Javaでは......。

そして、BASICでは・・・。

ここでは、言語を比較する練習をしているのですか?

=======

追伸:あなただけではありません・・・。

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

MQLがC++に完全準拠すべきと考える理由は何ですか?

...

ここでは、言語を比較する練習をしているのですか?

具体的なフレーズに反応したのです。落ち着いてください。カノコソウを飲んで寝なさい。 心配するのはよくないわ。...「C++」という言葉に熱くなる人もいるんですよ。