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

 
Alexey Navoykov:

引数をr値で 渡す機能を言語に追加するのはどうでしょうか?そうすれば、すべての問題が即座に解決し、あらゆるタイプに対応したユニバーサルなコンテナを作ることができるようになります。

如何してユニバーサルコンテナにはリンクと矢印が必要なのであって、こんなものは必要ないのです。

一般ユーザーはR値をする側ではないですしね。

 
Alexey Navoykov:

言語に引数をr値で 渡す機能を追加することについてはどう思われますか?特に、r-valueについては、上記のメソッドをオーバーロードすることになる。

これはまさに、すべてのSTLコンテナで実装されている方法です。

特に、スマートポインタ unique_ptr などの実装では、内部にユニークなリソースを保存するために、通常のコピーコンストラクタでは 対応できないため、この機能は非常に重要なものです。

では、パラメータを参照渡し する意味は何でしょうか?

 
Slava:

では、パラメータを参照渡し する意味は何でしょうか?

あなたは非常に奇妙な質問をしています。r-valueのリンクはセマンティックを移動するためだけのもので、それ以外は通常のリンクです。
 
Slava:

では、パラメータを参照渡し する意味はあるのでしょうか?

私もどういう参考になるのか、よくわかりません。元々、MQLで利用可能なl-value参照ではすべてのニーズをカバーできないことを述べていました。 この目的のためには、他のすべての型を受け入れるr-value参照が必要です。 したがって、r-valueとl-value用の2つのオーバーロード関数を組み合わせれば、すべての型の引数を、その起源にかかわらず受け入れることができるようになります。

定数はどこにも保存されず、その場で生成されるということは、l値ではなくr値で渡されることを意味します(C++とは異なります)。 どのような形で解釈されるかは原理的に問題ではなく、関数で受け付けられるかどうかが重要なのです。

 
Alexey Navoykov:

定数はどこにも保存されず、その場で生成されるということは、l値ではなくr値の形で渡されなければならないということですね(C++とは異なります)。 関数の中で受け取ることができれば、どのような形で解釈されても原則的には違いはありません。

r-valueの参照は、実際には、移動が行われるオブジェクトを意味する。

 
TheXpert:

つまり、一時的なオブジェクトを作成する必要があるのです。

当然ながら、対象物は常にどこかに存在している。このオブジェクトは、その場で、つまり一時的に作成されると書きました。

でも、スラバが何を求めているかは理解できたと思います。値で受け取れるのに、なぜ一時的なオブジェクトを参照で受け取る必要があるのか、という意味だ。

まあ、要は、1つのコピーで参照用と値用の関数を同時にオーバーロードすることは不可能ということです。

template<typename T>
 void f(T) { }
template<typename T>
 void f(T const&) { }
 
class A { };

void OnStart()
{
  A a;
  f(a);
  const int b=0;
  f(b);  // 'f' - ambiguous call to overloaded function with the same parameters
}

また、値をr-valueに置き換えることで、実用的なバリアントが得られます。

template<typename T>
 void f(T &&) { }
template<typename T>
 void f(T const&) { }
 
Alexey Navoykov:

つまり、値で取れるのに、なぜ一時的なオブジェクトを参照で取るのか、ということです。

というのも

void f(int) {}
void f(const int&) {}

void OnStart()
{
   const int x = 0;
   f(x); // 'f' - ambiguous call to overloaded function with the same parameters
}

というのも、通常は値で渡すよりも参照で渡した方が便利だからです。

また、メソッドがテンプレート化されている場合(これがすべての始まりです)、現在の動作ではまともに書けないだけです。

 
TheXpert:

また、その方法がテンプレートベースである場合(これがすべての始まりです)、現在の動作では単に正しく書けないだけです。

そうです。参照渡しされたintはあまり説得力がないので、分かりやすくするために私の例をテンプレートに置き換えたのです)
 
Alexey Navoykov:

そして、その値をr値に置き換えることで、動作するバリアントが得られます。

さほどでもない)

移動セマンティクスは、移動されるオブジェクトに、その内部を削除する必要がないことを伝えることを意味します。オブジェクトが定数である場合、mutableクラスのメンバが 必要ですが、mqlはそれをサポートしていません。

 
TheXpert:

さほどでもない)

移動セマンティクスは、移動されるオブジェクトに、その内部を削除する必要がないことを伝えることを意味します。オブジェクトが定数の場合、mutableクラスのメンバが 必要ですが、mqlはこれをサポートしていません。

そうですね、r-valueのconstは設定してはいけませんね(plusではそのようにコンパイルされません)。今すぐ修正します )