Безопасно ли использовать конструкторы в параметрах функций в C ++? - PullRequest
1 голос
/ 01 февраля 2012

Этот код C ++ завершается сбоем в Visual Studio 2010:


const sregex_iterator end;
for (sregex_iterator match(origString.begin(), origString.end(), regex(regExPattern)); match != end; ++match)
{
    useMatch(*match);
}

После первого цикла в первом шаге итератора (operator++) происходит сбой отладчика, указывающий на то, что regex_iterator «потерял».

Я заметил сомнительный конструктор регулярных выражений (я скопировал фрагмент откуда-то), и я попытался с этим:


const sregex_iterator end;
regex regexObj(regExPattern);
for (sregex_iterator match(origString.begin(), origString.end(), regexObj); match != end; ++match)
{
    useMatch(*match);
}

Это сработало отлично.

Но почему первая попытканеудачу?Я полагаю, что это должно быть с областью действия for или, может быть, с встроенным конструктором и тем фактом, что параметр regex в конструкторе итератора является ссылкой ...

Но, как я читал в stackoverflow, некоторое времяназад я помню только то, что понимаю, и хотел бы знать, безопасно ли использовать конструкторы в качестве параметров функции в C ++ (конечно, без использования new).

1 Ответ

5 голосов
/ 01 февраля 2012

Я думаю, что в первом случае регулярное выражение создается как временный объект и будет уничтожено сразу после инициализации совпадения.У него должен быть срок службы, который распространяется на весь цикл.

...