2016-12-30 5 views
18

패턴 매칭 기능성 언어 (때로는?)는 일부 바운드 값을 무시할 가능성이 있지만 C++ 17 구조화 바인딩을 사용하면 그럴 수없는 것 같습니다 (std::ignore with structured bindings?). 충고는 더미 이름을 사용하는 것이지만, 사용되지 않는 변수에 대한 경고를 얻습니다. 그 소리와 GCC 모두의 최신 헤드[[maybe_unused]]와 구조화 된 바인딩

이 있지만 나는 또한 기대했을 것이다 좋은 유용 예상되는 것은,

[[maybe_unused]] auto x =4 ; // fine, no warning 
[[maybe_unused]] auto [a,dummyb,dummyc] = std::tuple<int,int,float>(1,1,1.0f); 

이 작동합니다 않습니다

auto [g,[[maybe_unused]]dummyh,[[maybe_unused]]dymmyi] = 
     std::tuple<int,int,float>(1,1,1.0f); 

구체적인 이유는 여기에 attributes 사용할 수 없습니까? (기술적으로뿐만 아니라 표준에서도). gcc 나 clang도이를 허용하지 않습니다.


편집, 지원 상태 수집 : (godbolt/compiler explorer에게 감사). 그것은 (이전에도 수) 기대 작품과 같이

  • GCC 8.0 트렁크 (실험 g ++ 8.0.0 20171015)
  • 그 소리 4.0.0
  • ICC (18) (테스트하지, specs에 따라)

이지만 구조화 된 바인딩에서는 작동하지 않습니다. 구조 바인딩 논문에서 bug report

+2

중첩 된 분해를 잠재적으로 차단하는 것이 걱정되었을 수 있다고 상상합니다. –

+0

흠. 좋아 .' [g, [[아마도 _unused]]] = foo()'.. 더 많이 생각할수록, 그 하나의 속성을 외부에 두는 것만으로도 괜찮습니다 :-) –

+0

문제는 당신입니다. 어떤 변수가 사용되지 않았는지 알 수 없지만 외부에있는 경우 – serine

답변

8

:

3.8 명시 적 구성 요소를 무시할 수있는 방법이 있어야한다 :

http://www.open-std.org/jtc1/sc22/wg21/docs/papers/2016/p0144r2.pdf

그들은 자신의 추론을 논의?

동기는 사용하지 않는 이름에 대한 컴파일러 경고를 음소거하는 것입니다.

우리는 대답해야한다고 생각 "아직."이것은 사용에 의해 경우 동기를 부여하지 않습니다 (컴파일러 경고를 침묵하는 것은 동기 부여이지만,이 사용 사례 자체가되지 않습니다), 그리고 최고의 우리가 할 수있는 때까지 남아 이것은 보다 일반적인 패턴 일치 제안서의 컨텍스트에서 다시 확인하십시오. 여기서는 이 특별한 경우로 생략됩니다. 표준 : 넥타이

대칭이 표준처럼 뭔가를 사용하는 것이 좋습니다 것 :: 무시 :

tuple<T1,T2,T3> f(); 
    auto [x, std::ignore, z] = f(); // NOT proposed: ignore second element 

그러나,이 어색한 느낌. 언어 에서

예상하고 패턴 매칭은 _ 같은 와일드 카드를 제시 또는 *,하지만 우리는 아직 일치 패턴을 가지고 있지 않기 때문에 호환 될 것입니다 우리가 알고있는 구문을 선택하는 상조 수 있습니다. 패턴 일치가있는 으로 간주되기를 기다릴 수있는 순수 확장 프로그램입니다.

이것은 명시 적으로 주소가 [[maybe_unused]] 인 것은 아니지만, 나는 추론이 같을 것이라고 추측합니다. 컴파일러 경고를 중지하는 것은 유스 케이스가 아닙니다.