Будет ли удален временный объект, если на него нет постоянной ссылки? - PullRequest
5 голосов
/ 26 января 2012

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

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. Без привязки const ссылка на возвращенный объект get_string.

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

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

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

Примечание: Обе версии в MSVC в порядке.

1 Ответ

6 голосов
/ 26 января 2012

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

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

...