Почему функция regex_match в c ++ требует, чтобы строка поиска определялась вне функции?
392 просмотра
1 ответ
Я использую Visual Studio 2013 для разработки, которая использует v12 инструментов компилятора Microsoft C ++.
Следующий код выполняется нормально, печатая «foo» на консоли:
#include <regex>
#include <iostream>
#include <string>
std::string get() {
return std::string("foo bar");
}
int main() {
std::smatch matches;
std::string s = get();
std::regex_match(s, matches, std::regex("^(foo).*"));
std::cout << matches[1] << std::endl;
}
// Works as expected.
Тот же код со строкой «s», замененной функцией «get ()», выдает ошибку «несовместимые строковые итераторы» во время выполнения:
#include <regex>
#include <iostream>
#include <string>
std::string get() {
return std::string("foo bar");
}
int main() {
std::smatch matches;
std::regex_match(get(), matches, std::regex("^(foo).*"));
std::cout << matches[1] << std::endl;
}
// Debug Assertion Failed!
// Expression: string iterators incompatible
Это не имеет смысла для меня. Кто-нибудь может объяснить, почему это происходит?
Автор: Stephen Belden Источник Размещён: 13.11.2019 11:52Ответы (1)
10 плюса
Причина в том, что get()
возвращает временную строку, поэтому результаты сопоставления содержат итераторы в объекте, который больше не существует, и попытка использовать их - неопределенное поведение. Отладочные утверждения в библиотеке Visual Studio C ++ замечают эту проблему и прерывают вашу программу.
Изначально C ++ 11 разрешал то, что вы пытаетесь сделать, но, поскольку это было настолько опасно, это было предотвращено путем добавления удаленной перегрузки, std::regex_match
которая используется при попытке получить результаты сопоставления из временной строки, см. LWG DR 2329 . Это означает, что ваша программа не должна компилироваться в C ++ 14 (или в компиляторах, которые также реализуют DR в режиме C ++ 11). GCC пока не применяет изменения, я исправлю это.
Вопросы из категории :
- c++ What are the barriers to understanding pointers and what can be done to overcome them?
- c++ Какой самый простой способ для анализа файла INI в C ++?
- c++ Когда вы должны использовать «друг» в C ++?
- c++ Как вы очищаете переменную stringstream?
- c++ В C ++ конструктор и деструктор могут быть встроенными функциями?
- c++ Что такое виртуальный базовый класс в C ++?
- regex Learning Regular Expressions
- regex Regex и unicode
- regex Мое регулярное выражение слишком подходит. Как мне это остановить?
- regex Как выполнить подстановку Perl для строки, сохранив оригинал?
- regex Замена n-го экземпляра совпадения с регулярным выражением в Javascript
- regex Как заменить простые URL ссылками?
- visual-studio Ошибка Visual Studio: непредвиденная задача «GenerateResource»
- visual-studio Какой самый лучший бесплатный детектор утечки памяти для программы на C / C ++ и ее подключаемых библиотек DLL?
- visual-studio программно получить установочный каталог Visual Studio
- visual-studio В чем разница между Build Solution и Batch Build в Visual Studio 2008?
- visual-studio Как заставить Visual Studio заново создать файлы .designer для файлов aspx / ascx?
- visual-studio «Невозможно изменить тип DataType столбца после его получения» в Visual Studio 2005 DataSet Designer