ОК У меня есть эта последовательность событий:Разрушение аргументов до возвращения?
- я построить объект г-значение
- я передать итератор к этому объекту г-значения в функцию в качестве параметра
- Функция работает на этом итератор
- функция возвращает этот итератор по значению
- I разыменования итератора
Я не знаю, что вызывает очистку объекта r-value, является ли это прекращением этой строки?
ОК, теперь конкретика, я пытаюсь придумать лучший ответ на этот вопрос: string Multiplication in C++ И у меня есть код:
const auto bar = 13U;
const char multiplicand[] = "0, ";
const auto length = strlen(multiplicand);
const string foo(&*generate_n(string(bar * length, '\0').begin(), bar * length, [&]() {
static auto i = 0U;
return multiplicand[i++ % length];
}) - bar * length);
Так что я хочу знать, когда string
, который построен внутри generate_n
должно быть уничтожено. Кстати, похоже, что это нормально работает на gcc 5.1: http://ideone.com/Y8rDs5 Но я могу просто получить неопределенное поведение. Это вытекает из того факта, что код на ошибку сегментации Visual Studio 2015.
Не [this] (http://stackoverflow.com/questions/2506793/c-life-span-of-temporary-arguments) ответить на это о жизни? – NathanOliver
@NathanOliver Он говорит: «Обычно это означает, что он заканчивается символами'; '(или') ',' for', 'if',' while', 'switch' и т. Д.), Обозначая конец инструкции. В вашем примере это конец вызова функции. " Я думаю, что ')' является ответом на мой вопрос. Но «Обычно» в этом утверждении не является окончательным. Если очистка должна быть отложена до ';', тогда я золотой, но это будет означать, что Microsoft делает это неправильно ... –
Я не знаю, вызывает ли этот код UB, но лучший ответ на что-либо, что он не. –