25

C++11 中引入的std::minmax函数应该分别返回一对给定值中的最小值和最大值。

在这个例子中:

int a = 6, b = 5;
auto p = std::minmax(a, b);
std::cout << "p.first = " << p.first << std::endl;
std::cout << "p.second = " << p.second << std::endl;

这就像广告和印刷品一样工作

p.first = 5
p.second = 6

现在我想有效地修改ab强制b低于a,就像运行这段代码一样:

if (b > a)
    std::swap(a, b);

所以我写了这个:

int a = 5, b = 6;
std::tie(b, a) = std::minmax(a, b);
std::cout << "a = " << a << std::endl;
std::cout << "b = " << b << std::endl;

但是,这会打印:

a = 5
b = 5

改用 initializer_list 重载,如下所示:

std::tie(b, a) = std::minmax({a, b});

导致打印预期结果:

a = 6
b = 5

编译器是 GCC 4.7.1(也在 Linux 和 Windows 上使用 GCC 4.8.1 和 Mingw-w64 进行了测试)。我在http://ideone.com/fA0qw5创建了一个 SSCCE 。

为什么两个参数重载没有做使用时应该做的事情std::tie

4

1 回答 1

34

问题是std::minmax返回2 参数版本的引用。这样,一旦binstd::tie(b, a)被赋值,变化就会反映在b返回的部分中std::pair,给它的值5- 这反过来又被分配给ain std::tie(b, a)(5, 5)作为结果产生。

于 2013-09-20T08:48:39.500 回答