Статья 30 Скотта Мейерса "более эффективный C++" отображает шаблон программирования «прокси-объект».
Проблема в том, если у вас:
X x;
x[3]=42;
cout<<x[3]
... вам нужна перегрузка оператора [] X, чтобы иметь возможность различать использование L-значения и R-значения.
(возможно, вам нужен другой код для запуска, например, в первом случае может потребоваться интенсивное копирование, но во втором случае, возможно, мы можем просто передать ссылку).
Шаблон прокси состоит в том, что X содержит класс Proxy, а перегруженные версии operator[] X возвращают объект типа Proxy.
Итак, этот код становится:
X x;
{some Proxy object}=42;
cout<<{some Proxy object}
Теперь нам просто нужно дать нашему прокси-объекту переопределение для «operator=», которое обрабатывает первый случай, и переопределение для «преобразования в std::string или char*», которое обрабатывает второй.
И попытка C++ найти подходящее преобразование типов приведет к соответствующему переопределению.
Однако эта книга была написана до C++11, а одной из основных особенностей C++11 является новый оператор && (ссылка на R-значение).
Существует ли теперь более простой способ кодирования отдельных назначений R-значения и L-значения?
Является ли этот шаблон проектирования прокси-объекта устаревшим?