엔 클로징 범위의 변수를 "캡처"하기 위해식이 필요합니까?


10

다음 예제에서 함수 인수는 필수 표현식을 사용하여 표현식이 제대로 구성되어 있는지 테스트하는 데 사용됩니다. require 표현식은 인수를 취하지 않습니다. 함수 범위의 변수를 직접 사용합니다.

#include <cstddef>
#include <vector>

template<typename T>
void Resize(T &v, std::size_t const n)
{
  if constexpr (requires { v.resize(n); })
    v.resize(n);
}

template<typename T>
void Eziser(T &v, std::size_t const n)
{
  if constexpr (requires { v.eziser(n); })
    v.eziser(n);
}

int main()
{
  std::vector<int> v;

  Resize(v, 10u);
  Eziser(v, 10u);
}

위의 코드는 Clang concepts 분기로 컴파일됩니다. 그러나 GCC10은에 대한 호출 만 수락합니다 Resize. GCC9 얼음. Clang이 그것을 받아 들일 수 있습니까?


2
ICE는 항상 컴파일러 문제입니다.
Jarod42

나는이 지역 변수를 캡처에 허가되어 있지 않은 경우는 코드를 거부해야 하나 말할 것입니다 (모두 그렇게 Resize하고 Eziser해야 거부) 또는 두 기능은 컴파일해야한다. 나는 clang이 옳다고 말할 것이다.
Jarod42

@ Jarod42 네. GCC 행동은 분명히 버그가 있습니다. PR을 제출하겠습니다. 또한 Clang이 옳다고 생각하지만 확인하고 싶습니다.
metalfox

답변:


6

예, require-expression 은 범위에있는 모든 것을 사용할 수 있습니다. 중첩 된 요구 사항 이나 다른 상수 식을 제외하고는 이름이 지정된 유형 만 필요합니다 . 그것은 자신의 (공식) 매개 변수만큼이나 주변 선언에 해당됩니다.

[expr.prim.req] / 5 :

요구 사항 - 몸은 일련의 포함 요구 사항을 . 이러한 요구 사항 은 로컬 매개 변수, 템플릿 매개 변수 및 엔 클로징 컨텍스트에서 볼 수있는 다른 선언을 참조 할 수 있습니다.

당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.