구조화 된 바인딩으로 std :: ignore?


83

전주곡:

std::tuple<int, int, int> f();
std::tuple<int, int, float, int> g();

C ++ 1z는 구조화 된 바인딩에 대한 구문을 도입하여

int a, b, c;
std::tie(a, b, c) = f();

뭔가

auto [a, b, c] = f();

그러나 특정 구성 요소를 무시 std::tie하도록 지정할 수도 있습니다 std::ignore. 예 :

std::tie(a, b, std::ignore, c) = g();

새로운 구조화 된 바인딩 구문을 사용하여 유사한 작업을 수행 할 수 있습니까? 어떻게 작동할까요?


2
거기에 임의의 이름을 넣으십시오.
n. '대명사'm.

1
@nm은 임의의 이름으로 복사본을 만들지 않습니까?
Piotr Skotnicki 2011

1
@Piotr std::ignore나는 생각 보다 더 많은 사본이 없습니다 . 복사 제거가 보장되었으므로 더미 변수가 초기화됩니다. 와 함께 std::tie할당의 rhs에있는 임시 std::ignore가 초기화됩니다.
j6t

1
auto[IGNORE]고유 한 이름을 생성 하는 매크로를 가질 수 있습니다 (예 : 컴파일러 별 COUNTER 또는 LINE 사용 ). 그것은 읽을 수있는 충분한 것, 그리고 실제로 같은 기능을 것입니다 std::ignore에 대한 std::tie.
KABoissonneault

2
@PiotrSkotnicki 아니요, decomp 선언이 만드는 유일한 사본은 분해되는 것입니다. 선언되는 것은 해당 사물의 구성원 / 요소에 대한 별칭이거나 get반환 되는 항목에 바인딩되는 참조입니다 .
TC

답변:


58

구조화 된 바인딩 제안에는 질문에 답변하는 전용 섹션이 포함되어 있습니다 ( P0144R2 ).

3.8 구성 요소를 명시 적으로 무시하는 방법이 있어야합니까?

동기는 사용되지 않는 이름에 대한 컴파일러 경고를 침묵시키는 것입니다. 우리는 대답이“아직 아님”이어야한다고 생각합니다. 이것은 유스 케이스에 의해 동기가 부여되지 않으며 (컴파일러 경고를 침묵시키는 것은 동기가되지만 그 자체로는 유스 케이스가 아닙니다), 이것이 빠져야하는보다 일반적인 패턴 매칭 제안의 맥락에서 이것을 재검토 할 수있을 때까지 남겨 두는 것이 가장 좋습니다. 특별한 경우로.

대칭은 std::tie다음과 같은 것을 사용 하는 것이 좋습니다 std::ignore.

tuple<T1,T2,T3> f();

auto [x, std::ignore, z] = f(); // NOT proposed: ignore second element

그러나 이것은 어색하다.

언어 패턴 매칭을 기대하는 것은 같은 와일드 카드를 제시 할 수 _*,하지만 우리는 아직 패턴 매칭을 가지고 있지 않기 때문에 우리가 호환 될 것입니다 알고 구문을 선택하는 상조입니다. 이것은 패턴 매칭으로 고려 될 때까지 기다릴 수있는 순수한 확장입니다.

그러나 표준의 작업 초안은 현재 관련 국가 기관 (NB)에 의해 수정되고 있으며이 기능을 요청하는 NB 의견이 있습니다 ( P0488R0 , US100) :

분해 선언은를 std::tie사용하는 것처럼 반환 된 값 중 일부를 버리는 구문을 제공해야 합니다 std::ignore.


6
지금은 너무 늦었지만 사용하기 어색하다고 느끼고 향후 대체 될 기능이 기능을 전혀 사용할 수없는 것보다 낫다는 점을 지적하고 싶습니다. std::ignore구조화 된 바인딩 에는 다른 합리적인 해석이 없기 때문에 표준위원회가 타임머신을 원하게 만들 것입니다 .
Daniel H

10

새로운 구조화 된 바인딩 구문을 사용하여 유사한 작업을 수행 할 수 있습니까?

아니요. 나중에 언급되지 않는 변수 이름 만 구성하면됩니다.


25
사용되지 않는 변수 경고를 생성 -Wunused-variable할 수 있습니다. 사용할 수 있습니다. [[maybe_unused]] auto [ a, b, dummy ] = std::tuple(1,"2",3f);그러나 이는 사용되지 않은 항목이있을 수 있으며 어떤 항목이 있는지 알 수 없음을 의미합니다. 지금은 그 사건에 대한 좋은 해결책이 없습니다. 바라건대 그것은 C ++ 20에서 개선 될 것입니다. 여기에서 가져온 것 : stackoverflow.com/questions/41404001/…
serine

3
"지금 당장은이 경우에 대한 좋은 해결책이 없습니다." : 그것은 완전히 사실이 아닙니다 . 다른 변수에 영향을주지 않고 사용하지 않는 변수 경고제거하기 위해 를 사용할 수 있습니다(void)dummy; .
andreee

16
@andreee : 경고를 조용히하기 위해 진술을 사용하는 것은 "좋은 해결책"이라고 부르는 것이 아닙니다.
Nicol Bolas

"경고를 조용히하기 위해 진술을 사용하는 중 ..."진술이 부족합니까?
AndyJost

1
@AndyJost : 아니요,하지만 화면의 시각적 공간이 부족합니다. 특히 귀중한 수직 공간을 사용하여 경고를 조용히하는 것은 유용하지 않습니다.
Nicol Bolas
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.