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

Локальные ссылки на 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 ++ время жизни временного члена продлеваться, когда условие ложно?

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

20

Решение

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

§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, и именно это значение расширяется путем привязки к вашим ссылкам.

5

Другие решения

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

Обязывает ли C ++ время жизни временного члена продлеваться, когда условие ложно?

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

3

По вопросам рекламы [email protected]