Могу ли я обменять две переменные, используя кортеж и галстук?
int x, y;
....
std::tie(y, x) = std::make_tuple(x, y);
std::make_tuple
создает экземпляр кортежа, копию аргументов, поэтому нет проблем с этим, чтобы назначить обратно исходным переменным.
Это, однако, не идиоматично и более круговое, чем просто использование std::swap
, то есть это не код, который можно было бы ожидать, поэтому я бы этого не сделал.
Что касается эффективности, то только потому, что всегда возникают такие вопросы, которые полностью зависят от компилятора: все, что можно сказать, состоит в том, что если это имеет значение, измерьте.
В std::make_tuple
используется временный, а именно кортеж.
Чтобы отменить значения двух переменных основного типа интеграла, не используя временную переменную, вы можете просто использовать старый трюк XOR:
x ^= y;
y ^= x; // Sets y = original x value by cancelling the original y bits.
x ^= y; // Sets x = original y value by cancelling the original x bits.
Это четко определено для неподписанного типа. Это формально неопределенное поведение для подписанного типа if любое из двух значений отрицательное любое промежуточное значение не представляется в типе.
std::swap
: stackoverflow.com/questions/27671520/…make_tuple
возвращает временное значение, так в чем же выгода?