我试图按照以下代码使用std::tie()
交换两个变量(我知道std::swap
,我只是出于好奇而尝试这个):
#include <iostream>
#include <tuple>
using std::cin; using std::tie;
using std::cout; using std::endl;
using std::make_pair;
int main() {
int a = 2, b = 10;
cout << "Before Swapping using {}" << endl;
cout << "a: " << a << " b: " << b < <endl;
tie(a, b) = {b, a};
cout << "After Swapping using {}" << endl;
cout << "a: " << a << " b: " << b << endl;
a = 2, b = 10;
cout << "Before Swapping using make_pair()" << endl;
cout << "a: " << a << " b: " << b << endl;
tie(a, b) = make_pair(b, a);
cout << "After Swapping using make_pair()" << endl;
cout << "a: " << a << " b: " << b << endl;
return 0;
}
我使用g++ test.cpp -std=c++11 -o test
编译了它。
但输出是这样的:
Before Swapping using {}
a: 2 b: 10
After Swapping using {}
a: 10 b: 10
Before Swapping using make_pair()
a: 2 b: 10
After Swapping using make_pair()
a: 10 b: 2
所以,我的问题是,既然我们每次都可以编写{a, b}
而不是编写std::make_pair(a, b)
(C ++ 11以后),为什么这两个版本会提供不同的输出?
我的猜测是以下一行
std::tie(a, b) = {b, a};
没有成对,出于某种原因只改变a
的值。但我不确定。
答案 0 :(得分:13)
tie(a, b) = {b, a};
将使用std::tuple<int&, int&> operator = (std::tuple<int&, int&>&&)
。
而不是你期望的std::tuple<int&, int&> operator = (std::tuple<int, int>&&)
。
std::tie(a, b)
是std::tuple<int&, int&>
std::tuple
有几个operator =
,但唯一可行的(非类型){a, b}
是复制/移动分配。
答案 1 :(得分:5)
{b, a}
生成std::tuple<int&, int&>
而std::make_pair
生成std::pair<int, int>
。
考虑std::pair<int&, int&>
会发生什么。它实际上是将一个变量分配给另一个变量,然后尝试将另一个变量分配给第一个变量。这相当于执行a = b; b = a;
或b = a; a = b;
。
答案 2 :(得分:3)
只需使用make_tuple
std::tie(a, b) = std::make_tuple(b, a);
同样的事情a = b或b = a;