C++ 尝试使用{}和std::make_pair()交换两个变量时的不同行为
我试图按照以下代码使用C++ 尝试使用{}和std::make_pair()交换两个变量时的不同行为,c++,c++11,swap,std-pair,stdtuple,C++,C++11,Swap,Std Pair,Stdtuple,我试图按照以下代码使用std::tie()交换两个变量(我知道std::swap,我只是出于好奇而尝试): 因此,我的问题是,既然我们可以编写{a,b},而不是每次(C++11以后)都编写std::make_pair(a,b),为什么这两个版本的输出不同 我猜是下面这句话 std::tie(a, b) = {b, a}; 不是成对的,出于某种原因,只是对a的值进行了变异。但是我不确定。{b,a}生成一个std::tuple,而std::make_pair生成一个std::pair 考虑一下st
std::tie()
交换两个变量(我知道std::swap
,我只是出于好奇而尝试):
因此,我的问题是,既然我们可以编写{a,b}
,而不是每次(C++11以后)都编写std::make_pair(a,b)
,为什么这两个版本的输出不同
我猜是下面这句话
std::tie(a, b) = {b, a};
不是成对的,出于某种原因,只是对
a
的值进行了变异。但是我不确定。{b,a}
生成一个std::tuple
,而std::make_pair
生成一个std::pair
考虑一下std::pair
会发生什么。它本质上是将一个变量分配给另一个变量,然后尝试将另一个变量分配给第一个变量。这相当于做a=b;b=a代码>或b=a;a=b代码>tie(a,b)={b,a}代码>
将使用std::tuple操作符=(std::tuple&)
。
而不是像您期望的那样std::tuple operator=(std::tuple&&)
std::tie(a,b)
是一个std::tuple
std::tuple
有几个操作符=
,但是(非类型的){a,b}
唯一可行的方法是复制/移动赋值。只需使用make\u tuple即可
std::tie(a, b) = std::make_tuple(b, a);
这是同一件事a=b或b=a 看起来像是未定义的行为a
被设置为b
的值,然后更新的a
被写入b
。。。一个序列点问题。@Jarod42给出了下面的答案。你可以用{}构造一个对,这是对的,但是编译器需要知道,在那一点上,这就是你正在构造的。它不是一个对
,而是一个元组
。
std::tie(a, b) = {b, a};
std::tie(a, b) = std::make_tuple(b, a);