Учитывая метод Get(), который использовался для возврата ссылки, в этом коде есть проблема:
Код: Выделить всё
auto value = Object.Get();
Код: Выделить всё
valueОдним из возможных решений было бы сделать так, чтобы «обычные» способы создания копии объекта в автоматическом хранилище не работали. До гарантированного исключения я мог просто заблокировать все конструкторы копирования и перемещения для этого типа. Тогда псевдоссылка просто откажется компилироваться с приведенным выше кодом.
Но при гарантированном исключении мой метод Get, возвращающий псевдоссылку, удаляется в автоматическое хранилище и живет дольше, чем я предполагал. Более того, это меняет семантическое значение на этом сайте: с хранения копии на сохранение возможно висящей ссылки.
Блокировка автоматического вывода типа также будет работать, но я не думаю, что это разрешено.
Наличие решения любого из этих вопросов решило бы мою проблему. Я не думаю, что есть решение, поэтому вот моя общая проблема, которую я надеюсь решить (чтобы избежать проблем X/Y):
Конкретная проблема, которую я пытаюсь решить, заключается в том, что у меня есть тип поля свойств, который сопоставляет ключи с любыми, примерно так:
Код: Выделить всё
struct Properties {
std::any& operator[](std::string key);
};
Код: Выделить всё
struct Properties {
custom_any_pseudo_ref_type operator[](std::string key);
};
Отступая еще дальше в том, что я хочу, я меняю Свойства с владения картой «ключ-значение» на копию карты «ключ-значение», которую можно копировать при записи, но большая часть кода, использующего их, не очень const-правильно; он часто обращается к не-
Код: Выделить всё
constМой Any_pseudo_ref может различать доступ для чтения и записи, а при записи вызывать код копирования при записи поля свойств, которому он принадлежит, чтобы получить доступную для записи версию данных перед их возвратом, поэтому используйте следующий код:
Код: Выделить всё
Properties box;
box["a"] = 7;
// ...
// much later, a read:
std::cout
Подробнее здесь: [url]https://stackoverflow.com/questions/79892409/prevent-automatic-storage-of-pseudo-references[/url]
Мобильная версия