Уничтожение аргументов происходит до возвращения?
ОК, у меня есть эта последовательность событий:
- Я строю объект r-значения
- Я передаю итератор к этому объекту r-значения в функцию в качестве параметра
- Функция работает на этом итераторе
- Функция возвращает этот итератор по значению
- Я разыменую итератор
Я не знаю, что вызывает очистку объекта r-значения, это конец этой строки?
Хорошо, теперь для конкретики, я пытаюсь найти лучший ответ на этот вопрос: Умножение строк в 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 Но я мог просто получить неопределенное поведение. Это подразумевается тем, что код segfaults на Visual Studio 2015.
1 ответ
Временные, такие как string(bar * length, '\0')
уничтожены в конце полного выражения. Полное выражение является инициализатором const string foo
, Следовательно, временная строка не будет уничтожена до ctor foo
возвращается.