Запретить автоматическое сохранение псевдоссылокC++

Программы на C++. Форум разработчиков
Ответить
Anonymous
 Запретить автоматическое сохранение псевдоссылок

Сообщение Anonymous »

Я заменяю метод, возвращающий ссылку, методом, возвращающим псевдоссылку.
Учитывая метод Get(), который использовался для возврата ссылки, в этом коде есть проблема:

Код: Выделить всё

auto value = Object.Get();
становится копией объекта, когда Get возвращает ссылку. Когда он возвращает тип псевдоссылки, значение становится копией псевдоссылки, что является существенным изменением в семантике.
Одним из возможных решений было бы сделать так, чтобы «обычные» способы создания копии объекта в автоматическом хранилище не работали. До гарантированного исключения я мог просто заблокировать все конструкторы копирования и перемещения для этого типа. Тогда псевдоссылка просто откажется компилироваться с приведенным выше кодом.
Но при гарантированном исключении мой метод Get, возвращающий псевдоссылку, удаляется в автоматическое хранилище и живет дольше, чем я предполагал. Более того, это меняет семантическое значение на этом сайте: с хранения копии на сохранение возможно висящей ссылки.
Блокировка автоматического вывода типа также будет работать, но я не думаю, что это разрешено.
Наличие решения любого из этих вопросов решило бы мою проблему. Я не думаю, что есть решение, поэтому вот моя общая проблема, которую я надеюсь решить (чтобы избежать проблем X/Y):
Конкретная проблема, которую я пытаюсь решить, заключается в том, что у меня есть тип поля свойств, который сопоставляет ключи с любыми, примерно так:

Код: Выделить всё

struct Properties {
std::any& operator[](std::string key);
};
Я хочу изменить его на:

Код: Выделить всё

struct Properties {
custom_any_pseudo_ref_type operator[](std::string key);
};
и иметь код, который не будет хорошо работать с этим изменением (т.е. работает до и опасен после), разрушает сборку, но код, который будет хорошо платить за простое компиляцию без изменений.
Отступая еще дальше в том, что я хочу, я меняю Свойства с владения картой «ключ-значение» на копию карты «ключ-значение», которую можно копировать при записи, но большая часть кода, использующего их, не очень 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]
Ответить

Быстрый ответ

Изменение регистра текста: 
Смайлики
:) :( :oops: :roll: :wink: :muza: :clever: :sorry: :angel: :read: *x)
Ещё смайлики…
   
К этому ответу прикреплено по крайней мере одно вложение.

Если вы не хотите добавлять вложения, оставьте поля пустыми.

Максимально разрешённый размер вложения: 15 МБ.

Вернуться в «C++»