Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/actionscript-3/6.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C++ 尝试使用{}和std::make_pair()交换两个变量时的不同行为_C++_C++11_Swap_Std Pair_Stdtuple - Fatal编程技术网

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);