这是一个未定义的行为吗?我能不用温度交换价值吗?

时间:2014-12-27 23:24:18

标签: c++ c++11 c++14

我能用tuple和tie交换两个变量吗?

int x, y;
....
std::tie(y, x) = std::make_tuple(x, y);

1 个答案:

答案 0 :(得分: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.

对于无符号类型,这是明确定义的。如果这两个值中的任何一个是负的,那么它的正式未定义行为是签名类型。任何中间值都不能在类型中表示。