C++でテンプレート関数を扱ってると、稀に以下のようなエラーが発生します。
Cannot assign to return value because function 'operator*' returns a const value
const修飾された値の書き換えは出来ないという趣旨のエラーで、対象の値がconst修飾されていることがエラーの原因です。
C++の関数は文脈によってconst修飾された値を返す場合があるため注意して下さい。
特にC++のbegin関数やend関数は、引数に与えられた型の種類(左辺値、右辺値)によってconst修飾されたイテレータを返したりします。
std::string s = "a";
auto a = std::begin(s);
auto b = std::begin(std::string("b"));
*a = 'A'; // OK
*b = 'B'; // Cannot assign to return value because function 'operator*' returns a const value
またcbeginやcend関数を使用している場合も同様にconstイテレータを返すため、値の書き換えは出来なくなります。
ミュータブルな値を前提とする処理の場合は先程のコードのように参照渡しや値渡しであることを明示する必要があります。
std::string s = "a";
auto a = std::begin(s);
また元の変数がconst修飾されていないことも重要です。