首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >尝试使用{}和std::make_pair()交换两个变量时的不同行为

尝试使用{}和std::make_pair()交换两个变量时的不同行为
EN

Stack Overflow用户
提问于 2017-01-27 05:24:27
回答 3查看 663关注 0票数 12

我试图按照下面的代码使用std::tie()交换两个变量(我知道std::swap,我只是出于好奇而尝试):

代码语言:javascript
复制
#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编译的。

但是输出是这样的:

代码语言:javascript
复制
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之后的版本),为什么这两个版本给出了不同的输出?

我的猜测是下面这行

代码语言:javascript
复制
std::tie(a, b) = {b, a};

并不是成对的,出于某种原因,只是改变了a的值。但我不确定。

EN

回答 3

Stack Overflow用户

发布于 2017-01-27 05:29:52

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},唯一可行的是复制/移动赋值。

票数 13
EN

Stack Overflow用户

发布于 2017-01-27 05:29:37

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

票数 5
EN

Stack Overflow用户

发布于 2017-01-27 05:46:54

只需使用make_tuple即可

代码语言:javascript
复制
std::tie(a, b) = std::make_tuple(b, a);

这和a=b或b=a是一样的;

票数 3
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/41883235

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档