Будет ли временный объект удален, если на него нет константной ссылки?

Давайте посмотрим на эти две функции:

std::string get_string()
{
    std::string ret_value;
    // Calculate ret_value ...
    return ret_value;
}

void process_c_string(const char* s)
{
    std::cout << s << endl;
}

А вот два возможных вызова process_c_string с аргументом, возвращаемым get_string.

  1. Без привязки постоянной ссылки к возвращаемому объекту get_string.

    process_c_string(get_string().c_str());
    
  2. С привязкой константной ссылки к возвращаемому объекту get_string.

    const std::string& tmp_str = get_string();
    process_c_string(tmp_str.c_str());
    

Я знаю, что второй способ действителен, но как насчет первого, что стандарт говорит об этом случае? Будет ли временный объект, возвращенный get_string, удален до завершения process_c_str из-за того, что в нем нет const reference?

Примечание. Обе версии подходят для MSVC.


person Mihran Hovsepyan    schedule 26.01.2012    source источник


Ответы (1)


Время жизни временного расширения равно длине полного выражения, в котором оно было создано. В вашем случае временное будет уничтожено, но только после завершения вызова process_c_string. Пока функция не сохраняет указатель для последующего использования, все в порядке.

Во втором случае (связывание ссылки) время жизни этого временного объекта продлевается до объема ссылки, но я бы не советовал использовать этот шаблон в данном конкретном случае. Вы получите тот же эффект, создав локальную строку, инициализированную временной, и код будет проще. (С точки зрения производительности все компиляторы исключают потенциальную дополнительную копию в коде, поэтому стоимость будет одинаковой)

person David Rodríguez - dribeas    schedule 26.01.2012