Это неопределенное поведение? Могу ли я обмениваться значениями без температуры?

0

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

int x, y;
....
std::tie(y, x) = std::make_tuple(x, y);
  • 4
    Используйте std::swap : stackoverflow.com/questions/27671520/…
  • 1
    make_tuple возвращает временное значение, так в чем же выгода?
Показать ещё 7 комментариев
Теги:
c++11
c++14

1 ответ

5
Лучший ответ

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 любое из двух значений отрицательное любое промежуточное значение не представляется в типе.

  • 0
    Могу ли я вернуть свой плащ и колготки? :п
  • 0
    Ну конечно. Думаю.
Показать ещё 12 комментариев

Ещё вопросы

Сообщество Overcoder
Наверх
Меню