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