C++ 11 §5.1.2/6이 C++ 11 람다 코드는 정의되지 않은 동작을 호출합니까?
아니 람다 캡처 람다 표현식에 대한 폐쇄 형은 [...] 변환 기능을 갖는다 ...]. 이 변환 함수에 의해 반환되는 값은 호출 될 때 클로저 타입의 함수 호출 연산자를 호출하는 것과 같은 효과를 갖는 함수의 주소 여야한다.
참고 :이 변환이 항상 같은 유형의 같은 값을 반환라고하지 않습니다. 그렇다면 다음 프로그램이 UB 과과 관련된 모든 의미 파괴와 관련이 있습니까?
int main() {
auto f = []{};
return ((+f) == (+f));
}
주 : 실제 컴파일러가 true
하지만 아무것도를 제공했지만, 문제는 컴파일러가 법적 다른 작업을 수행 할 수있는 경우에 대한 경우 나는 철저하게 놀랠 것?
편집 :이 규격이 더 요구 사항을 [주를 부과하지 않은
C++ 11 §1.3.24
정의되지 않은 동작
행동 : 정의되지 않은 행동이 될 수있다 이 국제 표준이 행동의 명시 적 정의를 생략하거나 프로그램이 잘못된 구성이나 오류가있는 데이터를 사용할 때 예상된다.
람다에는 단항 +가 허용됩니까?그 외에, 당신의 프로그램은 잘 형성되어 있으며, main()으로부터 1을 리턴하기 때문에 구현 정의 된 행동만을 갖는다. – Deduplicator
@Deduplicator : 허용됩니다. 람다는 암시 적으로 포인터로 변환되며, 포인터는'+'를 수행 할 수 있습니다 ('+'는이 문맥에서 식별 함수입니다). – Mankarse