面白い!私はこれに気づいていなかったので、見つけるのに時間がかかりました (これは「移動セマンティクスを *this に拡張する」提案の一部でした)。表記法は、誰かが見たい場合に備えて、8.3.5 [dcl.decl] パラグラフ 4 で定義されています。
とにかく、この機能について知っていると、関数が呼び出されるオブジェクトが左辺値または右辺値である場合、オーバーロードに使用し、おそらく異なる動作をするのに最も役立つようです。特にオブジェクトが実際に左辺値である場合は、代入の結果など、実行できることを制限するためにそれを使用する必要はないようです。たとえば、右辺値への割り当てから右辺値を返す構文が必要な場合があります。
struct T {
auto operator=(T&) & -> T&;
auto operator=(T&&) & -> T&;
auto operator=(T&) && -> T;
auto operator=(T&&) && -> T;
};
ここでの意図は、割り当ての結果から移動できるようにすることです (それが価値があるかどうかはわかりませんが、そもそも割り当てをスキップしてみませんか?)。この機能を主に用途を制限するために使用するとは思いません。
個人的には、右辺値から左辺値を取得できる可能性があり、代入演算子は多くの場合これを行う方法です。たとえば、左辺値を関数に渡す必要があるが、それで何も使用したくないことがわかっている場合は、代入演算子を使用して左辺値を取得できます。
#include <vector>
void f(std::vector<int>&);
int main()
{
f(std::vector<int>() = std::vector<int>(10));
}
これは、右辺値から左辺値を取得するための代入演算子の悪用である可能性がありますが、偶然に発生する可能性は低いです。したがって、代入演算子を左辺値のみに適用できるように制限することで、無理をしてこれを不可能にするつもりはありません。もちろん、割り当てから右辺値への右辺値を返すこともこれを防ぎます。2 つの使用法のうち、どちらがより有用であるかは、検討の対象になる可能性があります。
ところで、clang は、バージョン 2.9 以降で引用した構文をサポートしているようです。