GCC 4.8.1 および Clang 2.9 以降がそれらをサポートするようになったため、参照修飾子 ( 「 *this の右辺値参照」とも呼ばれます) がより広く利用できるようになりました。たとえば、右辺値への代入を禁止することにより、クラスが組み込み型のように振る舞うことができます (そうしないと、右辺値から左辺値への不要なキャストが発生する可能性があります)。
class A
{
// ...
public:
A& operator=(A const& o) &
{
// ...
return *this;
}
};
一般に、右辺値のメンバー関数を呼び出すことは賢明const
であるため、左辺値参照修飾子は適切ではありません (コピーを返す代わりにメンバーをクラスから移動するなどの最適化に右辺値修飾子を使用できる場合を除きます)。 )。
反対に、pre decrement/increment 演算子などの変更演算子は、通常、オブジェクトへの左辺値参照を返すため、左辺値修飾する必要があります。したがって、質問もあります: const-correctness(内部キャッシュを使用する場合の適切な適用を含む)のためにのみマークされていないconst
概念的なメソッドとは別に、右辺値参照で変更/非メソッド(演算子を含む)を呼び出すことを許可する理由はありますか、これには現在、特定のスレッドセーフ保証の保証が含まれる可能性があります)は、コードベースで無視されていましたか?const
const
mutable
明確にするために、言語レベルで右辺値の変更メソッドを禁止することを提案しているわけではありません (少なくともこれはレガシー コードを壊す可能性があります)。よりクリーンで安全な API につながります。ただし、そうしないと、よりクリーンで驚くべきAPI が得られない例に興味があります。