【问题标题】:Overloads of std::minmax() and std::tiestd::minmax() 和 std::tie 的重载
【发布时间】:2013-09-20 08:33:49
【问题描述】:

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

【问题讨论】:

    标签: c++ c++11


    【解决方案1】:

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

    【讨论】:

      猜你喜欢
      • 2017-04-16
      • 1970-01-01
      • 1970-01-01
      • 2019-11-06
      • 1970-01-01
      • 2016-08-18
      • 1970-01-01
      • 2014-05-04
      • 1970-01-01
      相关资源
      最近更新 更多