2017-10-16 14 views
3

Structured bindings은 C++ 17로 도입되었습니다. 튜플이나 구조체에서 초기화 된 여러 변수를 선언 할 수있는 기능을 제공합니다.구조화 된 바인딩이 자동으로 작동하는 이유

이 코드는 c++17 컴파일러를 사용하여 컴파일됩니다. I는 auto와 변수를 선언하지 않으면

#include <iostream> 
#include <tuple> 

int main() { 
    auto tuple = std::make_tuple(1.0, 1); 

    auto [ d, i ] = tuple; 

    std::cout << "d=" << d << " i=" << i << '\n'; 

    return 0; 
} 

I 오류를 얻을

오류 : 람다 식 예상 본체 [D2, I2 = 튜플;

#include <iostream> 
#include <tuple> 

int main() { 
    auto tuple = std::make_tuple(1.0, 2); 

    double d2; 
    int i2; 

    [d2 , i2] = tuple; 

    return 0; 
} 

나는 clang version 4.0.0과 컴파일 옵션 -std=c++1z을 사용했다.

구조화 된 바인딩에 기존 변수를 할당 할 수 있습니까? auto을 사용해야합니까?

+7

구조적 바인딩은 변수를 정의하고 초기화 할 때만 가능합니다. 일반적인 할당 (이것은 [[std :: tie'] (http://en.cppreference.com/w/cpp/utility/tuple/tie)를 사용하여)으로는 불가능합니다. –

답변

7

당신의 GOT가 만 auto으로 허용 왜 꽤 나타내는 오류 메시지 : 문법 더욱 문맥 의존하게됩니다 모호함의 부족.

식의 시작 부분에있는 대괄호 쌍은 람다를 나타냅니다. 당신이 요구하는 것은 표준이 가끔[d2 , i2]이 값으로 d2i2을 캡처 람다의 시작임을 지정을위한 것이며, 다른 시간에 그것은 풀기 과제입니다. 모두는 그것을 따르는 것을 기반으로합니다.

언어에 추가하는 것은 가치가 없습니다. 특히 as Some programmer dude noted부터 튜플을 사용하여 원하는 것을 수행하려면 이미 std::tie이 있어야합니다.

뿐만 아니라 std::tie은 압축 해제 된 값 중 일부를 무시할 수 있도록 허용하지만 구조적 바인딩은 아직 지원하지 않습니다. 따라서 표준 라이브러리가 튜플로 이미하는 일을하기 위해 더 제한된 형식의 구문 설탕을 갖는 것이 전부입니다.


아, 그리고 당신이 std::tie 만 튜플로 작동 disgruntles 경우, 당신이 어떤 POD 자신과 함께 작동하도록 확장 할 수 있습니다. 이 magic_get implementation을보십시오. constexpr에 동일한 아이디어를 적용하여 POD를 std::tie에 공급할 수있는 참조 튜플로 변환 할 수 있습니다. 이런 식으로 뭔가 :

또한
std::tie(d2, i2) = magic_unpack(/*some POD that isn't a tuple*/); 
0

, 당신은 그것의 개별 구성 요소로 튜플을 풀고 std::tie()를 사용 할 수 있습니다. 예 :

#include <iostream> 
#include <tuple> 

int main() { 
    auto tuple = std::make_tuple(1.0, 1); 
    double d2; 
    int i2; 
    std::tie(d2, i2) = tuple; 

    std::cout << "d2=" << d2 << " i2=" << i2 << '\n'; 

    return 0; 
}