gpt4 book ai didi

c++ - std::minmax() 和 std::tie 的重载

转载 作者:IT老高 更新时间:2023-10-28 12:57:06 29 4
gpt4 key购买 nike

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

在这个例子中:

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 时双参数重载没有做它应该做的事情?

最佳答案

问题在于 std::minmax 为 2 参数版本返回 references。这样,一旦 std::tie(b, a) 中的 b 被分配,更改就会反射(reflect)在 b 部分返回的 std::pair 的值,给它 5 的值 - 这又被分配给 std 中的 a: :tie(b, a),产生 (5, 5) 作为结果。

关于c++ - std::minmax() 和 std::tie 的重载,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/18912199/

29 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com