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

标签 c++ c++11

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/

相关文章:

c++ - Netbeans 7.2 中无法识别的命令行选项 "-std=c++11"c++

c++ - 为什么当 N>=10 时这段代码会卡住?

c# - 如何在 Maya 中实现 MObject 选择器

c++ - 交流 emacs 和 C++ 代码

c++ - 可变参数模板 : how can I check if a specific class is part of the pack, 并在该类存在时执行该类的特定方法

c++ - 这个危险指针示例是否因为 ABA 问题而存在缺陷?

c++ - 如何生成仅包含 1 到 6 数字的 4 位数字?

c++ - strcmp 从 ‘char’ 到 ‘const char*’ 的转换

c++ - 如何使用OpenMPI编程运行SocWatch?

c++ - 免费注册 com 和 Dispatch LPPICTUREDISP