LINUX.ORG.RU

Можно ли хранить ссылку на то что возвращает разыменование итератора от std::match_results?

 , ,


0

1

Можно ли хранить ссылку на то что возвращает разыменование итератора от std::match_results? Т.е.

std::cmatch result;
...
auto &ref = *result.cbegin();
Я не знаю подробностей стандарта, на cppreference.com об этом ничего нет кроме размытой фразы что match_results содержит sub_matchи. Смотреть в исходники не предлогайте, это ни о чём.

Because std::match_results holds std::sub_matches, each of which is a pair of iterators into the original character sequence that was matched, it's undefined behavior to examine std::match_results if the original character sequence was destroyed or iterators to it were invalidated for other reasons.

Покуда жива строка, по которой искали, можно обращаться к результатам.

Т.е. ссылку хранить можно, но нужно следить за временем жизни оригинальной строки.

Ivan_qrt ★★★★★ ()
Ответ на: комментарий от Ivan_qrt

Естественно, если это был std::string, то не должно быть переаллокаций. Т.е. зарезервированный размер строки не должен увеличиваться.

Ivan_qrt ★★★★★ ()
Ответ на: комментарий от Ivan_qrt

В этой строчке всего лишь говорится что нельзя разрушать оригинальную строку.

normann ★★ ()

auto &ref = result.cbegin();

Вот это называется «Reference Lifetime Extension». Вполне себе валидная практика. Только смотри, чтоб ссылка не пережила сам result и то, на что он ссылается (т.е. изначальная строка):

Because std::match_results holds std::sub_matches, each of which is a pair of iterators into the original character sequence that was matched, it’s undefined behavior to examine std::match_results if the original character sequence was destroyed or iterators to it were invalidated for other reasons.

KennyMinigun ★★★★★ ()
Последнее исправление: KennyMinigun (всего исправлений: 2)
Ответ на: комментарий от KennyMinigun

cbegin() возвращает const_iterator, поэтому не понятно, зачем тут хранить ссылку на итератор, вместо самого итератора…

auto &ref = result.cbegin();
// вместо
auto iter = result.cbegin();

Сначала не понял, причем тут «Reference Lifetime Extension», думал возвращается ссылка. Но тут зачем-то сохраняют ссылку на итератор, который становится временным объектом, чье время жизни продлевается ссылкой, вместо хранения итератора напрямую.

anonymous ()

хранить можно

до вызова деструктора result

anonymous ()
Вы не можете добавлять комментарии в эту тему. Тема перемещена в архив.