<algorithm>と<utility>の両方にstd :: moveがあるのはなぜですか


8

std::moveがここに投稿するのを見るほとんどの場合、それは<utility>バージョンを参照しています。

std::move<algorithm>、実際には、その名前が示唆している何を移動し、一方std::moveでは、<utility>ちょうど基本的に最終的には左辺値にはxValueを移動するための前処理段階ではxValue、にその引数をキャストします。それでmove、それぞれの機能が異なるときに、これらの両方に名前を付けるのは、ちょっと混乱しませんか?



2
はい、move呼ばれるべきmake_rvalueでしたか、それらの線に沿って何か。単一のパラメーターでstd::moveは実際には何も動かないことを何度も説明するのはイライラします。
NathanOliver

の1つ<algorithm>は、単に<utility>範囲全体に適用されたものです。
リンケンビョウ

1
@KaenbyouRinはい、ただしの1つは<algorithm>実際に移動を実行します(移動する型に定義された移動代入演算子があると仮定します)。
Iamanon

1
ホットテイク:std::moveライブラリ関数の代わりに演算子を作成する必要がありました。std::move長くなっていたよりも良い名前は、それはひどいです。
ブライアン

回答:


7

では、これらの両方をmoveと名付けるのは、少し混乱しているのではないでしょうか。

特に、オーバーロードをサポートする言語に慣れていない人は、混乱する可能性があります。プログラミングガイドラインでは、通常、個別の意味を持つオーバーロードが推奨されないのは事実です。

しかし、これは主観的なものですが、同じ名前の関数が2つあることを知ることもそれほど難しくありません。異なる引数リストは、一方を他方から簡単に認識するのに十分なコンテキストを提供します。

なぜstd :: moveが両方にあり、

言語の設計者が両方の関数に同じ名前を使用することを選択したためです。

std::move両方の機能を表現する非常に簡潔な方法です。の1つ<algorithm>std::copy、同じヘッダーからの補足です。

一方、std :: move inは、その引数をxvalueにキャストします。これは基本的に、最終的に移動するための前処理ステップにすぎません

関数の名前を表現できるのは、関数の機能を説明することだけではありません。この場合、名前は関数を使用したプログラマーの意図を表します。プログラマーは、可能であれば、引数lvalueから移動するつもりです。

これは、プログラマがかなり頻繁に書く必要があるかもしれないものです。したがって、非常に短い名前が必要です。

弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.