Локальные ссылки на lvalue-to-const и rvalue могут продлить время жизни временных файлов:
const std::string& a = std::string("hello");
std::string&& b = std::string("world");
Это также работает, когда инициализатор не является простым выражением, но использует условный оператор?
std::string&& c = condition ? std::string("hello") : std::string("world");
Что если один из результатов является временным объектом, а другой — нет?
std::string d = "hello";
const std::string& e = condition ? d : std::string("world");
Обязывает ли C ++ время жизни временного члена продлеваться, когда условие ложно?
Вопрос возник при ответе этот вопрос о не копируемых объектах.
Оба из них в порядке.
§5.16 говорит (чрезвычайно сокращенно):
2 Если второй или третий операнд имеет тип void
Нету.
3 В противном случае, если второй и третий операнд имеют разные типы
Нету.
4 Если второй и третий операнды являются значениями одной и той же категории значений
Нету. (В первом случае оба являются prvalue, а во втором — glvalue, а один — prvalue.)
5 В противном случае результат является prvalue
Итак, оба из них приводят к prvalues. Так что привязка в порядке, но с чем связана?
6 Стандартные преобразования Lvalue-to-rvalue (4.1), массива-указателя (4.2) и функции-указателя (4.3) выполняются для второго и третьего операндов.
Хорошо, так что теперь оба являются значениями, если они еще не были.
6 (продолжение) После этих преобразований выполняется одно из следующих:
Второй и третий операнды имеют одинаковый тип; результат такого типа. Если операнды имеют тип класса, результат является временным значением типа результата, которое инициализируется копией из второго или третьего операнда в зависимости от значения первого операнда.
Хорошо, так что либо std::string(first_operand)
или же std::string(second_operand)
,
Независимо от этого, результатом условного выражения является новое временное значение prvalue, и именно это значение расширяется путем привязки к вашим ссылкам.
std::string d = "hello";
const std::string& e = condition ? d : std::string("world");
Обязывает ли C ++ время жизни временного члена продлеваться, когда условие ложно?
Это будет. Условное выражение — это rvalue-выражение, и когда оно связано с const
ссылка на компилятор создаст неназванный объект и свяжет ссылку на него. То, что я не уверен на 100%, является ли временный, чья жизнь продлена std::string("world")
или его копия (концептуально) сделана (и уничтожена).