Я хочу написать класс, аналогичный приведенному ниже, где IteratorLike
может быть разыменовано только к новому значению, поскольку итератор предоставляет представление, отличное от базовой структуры, что делает возврат простой ссылки невозможным.
class IteratorLike
{
public:
MyValue operator*() const { return MyValue(...); }
auto operator->() const { return **this; } // This does not work generally due to member access semantics.
};
В общем, я просто хочу, чтобы значения IteratorLike()->x
до означали то же самое , что и (*IteratorLike()).x
.
Можно просто перегрузить operator->()
в классе MyValue
, но Я хочу, чтобы это работало во всех случаях. Использование типа-обертки, который перегружает operator->()
, кажется приемлемым решением, но это не работает при возврате значения r. В пример на godbolt является работающей реализацией такой оболочки, включая неопределенное поведение, которое она вызывает из-за висячей ссылки.
Есть ли способ заставить эту работу работать?
Если бы оболочка могла вернуть указатель на значение, то строка int &qa = MyIteratorLike()->x;
в моем понимании была бы поймана компилятором, но такая вещь кажется невозможной.