std :: minmax()和std :: tie的重载

时间:2013-09-20 08:33:49

标签: c++ c++11

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上使用Mingw-w64在GCC 4.8.1上测试过)。 我在http://ideone.com/fA0qw5创建了一个SSCCE。

为什么在使用std::tie时,双参数超载没有做它应该做的事情?

1 个答案:

答案 0 :(得分:32)

问题是std::minmax为2参数版本返回引用。这样,只要b中的std::tie(b, a)被分配,更改就会反映在返回的b的{​​{1}}部分中,并赋予其{{1}的值 - } - 然后分配给std::pair中的5,产生a作为结果。