2017-01-26 20 views
12

std::tie()을 사용하여 두 변수를 바꿔 쓰려고했습니다 (나는 std::swap을 알고 있습니다. 호기심에서 벗어났습니다.) :{} 및 std :: make_pair()를 사용하여 두 변수를 바꿀 때 다른 동작이 발생했습니다.

#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 

그래서, 우리가 대신 std::make_pair(a, b) 매번 작성하는 {a, b}을 쓸 수 있기 때문에 내 질문은, (C++ 11 년 이후), 왜이 두 가지 버전이 제공하는 다른 출력?

내 생각 엔 다음 줄

std::tie(a, b) = {b, a}; 

이 한 쌍을 만들고 어떤 이유로 만 a의 가치를 돌연변이되지 않는 것이 었습니다. 그러나 나는 확실하지 않다.

+0

은 정의되지 않은 동작처럼 보입니다 ...'a'는'b'의 값으로 설정되고 업데이트 된'a'는'b'에 쓰여집니다 ... 시퀀스 포인트 문제입니다. –

+0

@ Jarod42는 아래 답변을 제공합니다. 당신은 {}로 쌍을 만들 수 있지만, 컴파일러는 그 시점에서 당신이 구성하고있는 것을 알아야합니다. –

답변

5

{b, a}std::tuple<int&, int&>이고, std::make_pairstd::pair<int, int>이됩니다.

std::pair<int&, int&>의 경우를 생각해보십시오. 기본적으로 다른 변수 중 하나를 다른 변수에 할당 한 다음 다른 변수를 첫 번째 변수에 할당하려고합니다. a = b; b = a; 또는 b = a; a = b;을 수행하는 것과 같습니다.

+0

'pair '을 만들지 않으며,'tuple '을 만듭니다. – Barry

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}과 함께 실행 가능한 것은 복사/이동 할당입니다.

3

은 make_tuple과

std::tie(a, b) = std::make_tuple(b, a); 

는 = A 같은 일의 A = B 또는 b의 사용;