在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;
Run Code Online (Sandbox Code Playgroud)
这与宣传和打印一样
p.first = 5
p.second = 6
现在我想有效地修改a并b强制b低于a,就像运行这段代码一样:
if (b > a)
std::swap(a, b);
Run Code Online (Sandbox Code Playgroud)
所以我写了这个:
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;
Run Code Online (Sandbox Code Playgroud)
但是,这打印:
a = 5
b = 5
使用initializer_list重载,如下所示:
std::tie(b, a) = std::minmax({a, b});
Run Code Online (Sandbox Code Playgroud)
导致打印预期结果:
a = 6
b = 5
编译器是GCC 4.7.1(在Linux和Windows上使用Mingw-w64在GCC 4.8.1上测试过).我在http://ideone.com/fA0qw5上创建了一个SSCCE .
为什么两个参数超载时没有做到它在使用时应该做的事情std::tie?
Xeo*_*Xeo 34
问题是std::minmax返回2参数版本的引用.这样,只要b在std::tie(b, a)赋值中,变化就会反映在b返回的部分中std::pair,赋予它的值5- 然后将其赋值给ain std::tie(b, a),(5, 5)作为结果产生.
| 归档时间: |
|
| 查看次数: |
887 次 |
| 最近记录: |