1

ОК У меня есть эта последовательность событий:Разрушение аргументов до возвращения?

  1. я построить объект г-значение
  2. я передать итератор к этому объекту г-значения в функцию в качестве параметра
  3. Функция работает на этом итератор
  4. функция возвращает этот итератор по значению
  5. 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.

+1

Не [this] (http://stackoverflow.com/questions/2506793/c-life-span-of-temporary-arguments) ответить на это о жизни? – NathanOliver

+0

@NathanOliver Он говорит: «Обычно это означает, что он заканчивается символами'; '(или') ',' for', 'if',' while', 'switch' и т. Д.), Обозначая конец инструкции. В вашем примере это конец вызова функции. " Я думаю, что ')' является ответом на мой вопрос. Но «Обычно» в этом утверждении не является окончательным. Если очистка должна быть отложена до ';', тогда я золотой, но это будет означать, что Microsoft делает это неправильно ... –

+1

Я не знаю, вызывает ли этот код UB, но лучший ответ на что-либо, что он не. –

ответ

1

временных такие как string(bar * length, '\0') уничтожаются в конце полного выражения. Полное выражение является инициализатором const string foo. Следовательно, временная строка не будет уничтожена до возврата ctor foo.

+0

Вот что я подумал и из раздела 12.2 чтения. Однако наших мнений недостаточно, чтобы поддержать этот ответ. Можете ли вы дать источник? –

+0

Источник - действительно 12.2. Обратите внимание, что кажущееся исключение не применяется: «Существует два контекста, в которых временные объекты уничтожаются в другой точке, чем конец полного выражения. Первый контекст - это когда ** выражение появляется как инициализатор ** для определения декларатора объект. В этом контексте временное, которое содержит результат выражения, сохраняется до завершения инициализации объекта ». Это не применяется, поскольку применяется только к временному из полного выражения, а не к другим временным. – MSalters

+0

ОК, я согласен, но это временное, которое содержит * return *. 12.2 [class.temporary] 2 говорит о выражении 'X b = f (X (2));': "Реализация может использовать временную структуру, в которой нужно построить' X (2) 'перед передачей ее в' f() 'используя конструктор' '' '' '' '' '' '' '' '' '' '' '' '' '' '' '' '' '' '' '' '' '' '' '' '' '' '' '' '' '' '' '' '' '' '' '' '' '' '' '' ''. Моя проблема в том, что если аргумент не передается по значению, то когда временное/пространство используется для удержания аргумента, очищенного? –