programing

constexpr은 람다 함수 / 식에서 지원됩니까?

procenter 2021. 1. 15. 19:47
반응형

constexpr은 람다 함수 / 식에서 지원됩니까?


struct Test
{
  static const int value = []() -> int { return 0; } ();
};

gcc-4.6을 사용하면 error: function needs to be constexpr. constexpr여러 장소에서 여러 가지 조합을 시도 했지만 운이 없습니다.

가요 constexpr(관계없이뿐만 아니라 람다 함수 지원 return유형 지정된 여부)? 올바른 구문은 무엇입니까?

가능한 해결 방법이 있습니까?


업데이트 : C ++ 17부터 상수 표현식에 람다가 허용됩니다.


Lambda는 현재 (C ++ 14) [expr.const] / (2.6)에 따라 상수 표현식에서 허용되지 않지만 N4487 이 승인 되면 허용됩니다 (작업 초안 N4582에서 찾을 수 있음).

이 제안은 상수 표현식에서 람다 표현식허용 하여 기존 제한을 제거 할 것을 제안합니다 . 저자는 특정 람다 표현식 및 특정 클로저 객체에 대한 연산이 상수 표현식 내에 나타날 수 있다고 제안합니다 . 그렇게함으로써 우리는 또한 데이터 멤버 각각의 유형이 리터럴 유형 인 경우 클로저 유형을 리터럴 유형으로 간주 할 것을 제안합니다. 그리고, 그 경우, constexpr지시자는 생성 된 함수 호출 연산자 것이, 람다 - 선언자 내에 생략 constexpr그것의 요구 조건을 만족한다면 constexpr(받는 유사한 기능 constexpr이미 내재적 정의 생성자와 할당 연산자 기능 발생 추론).


C ++ 0x FDIS §7.1.5 [dcl.constexpr] / 1에서 :

constexpr지정은 변수, 함수 또는 함수 템플릿의 선언, 또는 문자 형태의 정적 데이터 멤버 선언의 정의를 적용한다.

람다 식은 그런 것이 아니므로 선언 할 수 없습니다 constexpr.


C ++ 17 이전에는 람다가 constexpr. 상수 표현식 내에서는 사용할 수 없습니다 .

C ++ 17로 시작하는 람다는 constexpr의미가 있습니다. 제안 N4487 은 C ++ 17 표준에 포함될 것입니다. 자신의 웹 사이트 허브 셔터는 ISO C ++위원회의 의자, 다음과 같이 말했다

Lambda는 이제 constexpr 함수 내에서 허용됩니다 .


FFWD에서 2018 년까지 :)

auto my_const_expression_lambda = []()
  constexpr -> bool
{
   return true ;
}

C ++ 17 이후

참조 URL : https://stackoverflow.com/questions/6420085/is-constexpr-supported-with-lambda-functions-expressions

반응형