Подтвердить что ты не робот

Продление срока службы и условный оператор

локальные ссылки ссылок на ссылки и константы 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");

Предоставляет ли С++ срок жизни временного расширения, когда условие является ложным?

Вопрос возник при ответе этого вопроса о не скопируемых объектах.

4b9b3361

Ответ 1

Оба из них в порядке.

В §5.16 говорится (необычайно сокращенно):

2 Если либо второй, либо третий операнд имеет тип void

Неа.

3 В противном случае, если второй и третий операнды имеют разные типы

Неа.

4 Если второй и третий операнды являются glvalues ​​одной и той же категории значений

Неа. (Во-первых, оба являются prvalues, а во втором - glvalue, а одно - prvalue.)

5 В противном случае результатом будет prvalue

Хорошо, так что оба они приводят к prvalues. Итак, привязка прекрасна, но что связывание с?

6 Для второго и третьего операндов выполняются значения Lvalue-to-rvalue (4.1), преобразования от множества к указателю (4.2) и стандартного преобразования (4.2).

Хорошо, так что оба теперь rvalues, если они еще не были.

6 (продолжение) После этих преобразований должно выполняться одно из следующих условий:

Второй и третий операнды имеют один и тот же тип; результат такого типа. Если операнды имеют тип класса, результатом является временное значение prvalue для типа результата, которое инициализируется копированием из второго операнда или третьего операнда в зависимости от значения первого операнда.

Хорошо, так что это либо std::string(first_operand), либо std::string(second_operand).

Независимо, результатом условного выражения является новое временное значение prvalue, и это значение, которое расширяется путем привязки к вашим ссылкам.

Ответ 2

std::string d = "hello";
const std::string& e = condition ? d : std::string("world");

Предоставляет ли С++ срок жизни временного расширения, когда условие является ложным?

Это будет. Условное выражение rvalue и при привязке с помощью ссылки const компилятор создаст неназванный объект и привяжет ссылку к нему. То, что я не уверен на 100%, - это то, является ли время, продолжительность жизни которого продлевается, std::string("world"), или его копия (концептуально) сделана (и отменена).