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
现在我想有效地修改a
和b
来强制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/