Заставить перегруженный оператор доступа к элементу в C ++ вернуть временный - PullRequest
2 голосов
/ 24 января 2020

Я хочу написать класс, аналогичный приведенному ниже, где 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; в моем понимании была бы поймана компилятором, но такая вещь кажется невозможной.

1 Ответ

2 голосов
/ 24 января 2020

Есть ли способ заставить эту работу?

Нет. Категория значений - это свойство выражения, а не типа. "указатель на значение" не вещь

...