Shu*_*ham 12 c++ swap c++11 stdtuple std-pair
我试图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;
}
Run Code Online (Sandbox Code Playgroud)
我用它编译了它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
Run Code Online (Sandbox Code Playgroud)
所以,我的问题是,因为我们可以编写{a, b}而不是std::make_pair(a, b)每次编写(C++ 11以后),为什么这两个版本提供不同的输出?
我的猜测是以下一行
std::tie(a, b) = {b, a};
Run Code Online (Sandbox Code Playgroud)
没有成对,出于某种原因只是改变了它的价值a.但我不确定.
Jar*_*d42 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}是复制/移动分配.
{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;.
| 归档时间: |
|
| 查看次数: |
598 次 |
| 最近记录: |