2012-02-01 2 views
1
код

Этот C++ терпит неудачу в Visual Studio 2010:Можно безопасно использовать конструкторы в функциональных параметрах в C++?


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

Правильно ли, что вы не инициализируете 'const sregex_iterator end' ничем? – Chowlett

+1

@Chowlett: Да, это (неинтуитивный) способ создания итератора «end marker». –

ответ

5

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

+0

+1: Похоже, что после инициализации будет выглядеть шаблон регулярного выражения (выходящий из области видимости). –

+0

Итак, если вы вызываете конструктор в параметре метода, он имеет только область вызова ?. Это будет работать, только если метод копирует параметр (или он передается по значению), не так ли? И, почему работает первый цикл? Это не работает в операторе ++ –

+0

Еще одна вещь: если вы правы (и я думаю, что вы есть), пример на этой странице неверен, не так ли? http://en.cppreference.com/w/cpp/regex/regex_iterator –