string.Compare ("string a", "STRING A", true)
Он будет работать для каждой строки
Это не UB.
, но, насколько мне известно,
blockquote>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
.
Это хорошо определенное поведение.
const std::tuple<int, int>& t = f();
не дает вам ссылку на кортеж, который вы создали в f()
, потому что они имеют разные типы. Вместо этого получается, что временное значение std::tuple<int, int>
создается из возврата f()
, а затем это временное значение связывается с t
. Поскольку это копия, вы получаете значение i
в тот момент времени и больше не связаны с ней.
Если бы вы использовали
const std::tuple<int&, int>& t = f();
, то 21
были бы напечатаны, так как у вас все еще была бы ссылка на i
в кортеже.