Продление времени жизни std :: tuple < int & amp;, int > назначив его const std :: tuple < int, int > & amp;

string.Compare ("string a", "STRING A", true)

Он будет работать для каждой строки

5
задан Mestkon 18 January 2019 в 14:15
поделиться

2 ответа

Это не UB.

, но, насколько мне известно, std::tuple<int&, int> не относится к типу std::tuple<int, int>.

Да, и ссылка не может напрямую связываться с объектом другого типа. Учитывая const std::tuple<int, int>& t = f();, возвращаемое std::tuple<int&, int> будет преобразовано в std::tuple<int, int> неявно, что является временным std::tuple<int, int>. Тогда временная привязка связывается с t и получает время жизни, увеличенное до времени жизни t.

0
ответ дан songyuanyao 18 January 2019 в 14:15
поделиться

Это хорошо определенное поведение.

const std::tuple<int, int>& t = f();

не дает вам ссылку на кортеж, который вы создали в f(), потому что они имеют разные типы. Вместо этого получается, что временное значение std::tuple<int, int> создается из возврата f(), а затем это временное значение связывается с t. Поскольку это копия, вы получаете значение i в тот момент времени и больше не связаны с ней.

Если бы вы использовали

const std::tuple<int&, int>& t = f();

, то 21 были бы напечатаны, так как у вас все еще была бы ссылка на i в кортеже.

0
ответ дан NathanOliver 18 January 2019 в 14:15
поделиться
Другие вопросы по тегам:

Похожие вопросы: