Вопрос:

Почему функция regex_match в c ++ требует, чтобы строка поиска определялась вне функции?

c++ regex visual-studio

392 просмотра

1 ответ

371 Репутация автора

Я использую 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 Источник Размещён: 09.12.2014 11:48

Ответы (1)


10 плюса

140026 Репутация автора

Решение

Причина в том, что get()возвращает временную строку, поэтому результаты сопоставления содержат итераторы в объекте, который больше не существует, и попытка использовать их - неопределенное поведение. Отладочные утверждения в библиотеке Visual Studio C ++ замечают эту проблему и прерывают вашу программу.

Изначально C ++ 11 разрешал то, что вы пытаетесь сделать, но, поскольку это было настолько опасно, это было предотвращено путем добавления удаленной перегрузки, std::regex_matchкоторая используется при попытке получить результаты сопоставления из временной строки, см. LWG DR 2329 . Это означает, что ваша программа не должна компилироваться в C ++ 14 (или в компиляторах, которые также реализуют DR в режиме C ++ 11). GCC пока не применяет изменения, я исправлю это.

Автор: Jonathan Wakely Размещён: 10.12.2014 12:00
Вопросы из категории :
32x32