2014-06-14 2 views
3

C++ 11 §5.1.2/6이 C++ 11 람다 코드는 정의되지 않은 동작을 호출합니까?

아니 람다 캡처 람다 표현식에 대한 폐쇄 형은 [...] 변환 기능을 갖는다 ...]. 이 변환 함수에 의해 반환되는 값은 호출 될 때 클로저 타입의 함수 호출 연산자를 호출하는 것과 같은 효과를 갖는 함수의 주소 여야한다.

참고 :이 변환이 항상 같은 유형의 같은 값을 반환라고하지 않습니다. 그렇다면 다음 프로그램이 UB 과 관련된 모든 의미 파괴와 관련이 있습니까?

int main() { 
    auto f = []{}; 
    return ((+f) == (+f)); 
} 

주 : 실제 컴파일러가 true하지만 아무것도를 제공했지만, 문제는 컴파일러가 법적 다른 작업을 수행 할 수있는 경우에 대한 경우 나는 철저하게 놀랠 것?


편집 :이 규격이 더 요구 사항을 [주를 부과하지 않은

C++ 11 §1.3.24

정의되지 않은 동작

행동 : 정의되지 않은 행동이 될 수있다 이 국제 표준이 행동의 명시 적 정의를 생략하거나 프로그램이 잘못된 구성이나 오류가있는 데이터를 사용할 때 예상된다.

+0

람다에는 단항 +가 허용됩니까?그 외에, 당신의 프로그램은 잘 형성되어 있으며, main()으로부터 1을 리턴하기 때문에 구현 정의 된 행동만을 갖는다. – Deduplicator

+0

@Deduplicator : 허용됩니다. 람다는 암시 적으로 포인터로 변환되며, 포인터는'+'를 수행 할 수 있습니다 ('+'는이 문맥에서 식별 함수입니다). – Mankarse

답변

1

(같은 유형의) 함수 포인터가 서로 같지 않더라도 같음을 테스트 할 수 있습니다 (그렇지 않으면 함수 포인터의 경우 ==). [expr.eq]에서

은 : (포인터 변환 후) 동일한 유형의

포인터를 지 어떤지를 비교 할 수 있습니다. 동일한 유형의 두 포인터는 모두 널이거나 둘 다 동일한 함수를 가리 키거나 둘 다 동일한 주소 (3.9.2)를 나타내는 경우에만 같음을 비교합니다.

정의되지 않은 동작이있는 프로그램이 없습니다. 당신의 프로그램은 동등 검사가 true 또는 false 중 하나를 반환 할 수 있다는 점에서 불특정 행동을하지만 프로그램은 비강 악마를 소환하거나, 미사일을 발사하거나, 하드 드라이브를 닦지 못하거나, 정의되지 않은 행동과 관련된 다른 불쾌한 행동을 할 수 없습니다.

+0

정의되지 않은 동작에 대해 1.3.24 절의 인용문을 참조하십시오. – BCS

+0

정의되지 않은 동작이 무엇인지 압니다 ...이 대답에서 설명한 것처럼 프로그램에는 * undefined * behavior가 아닌 * unspecified * behavior가 있습니다. – Mankarse

+0

불특정하다고 생각하지 않습니다. 항상 동일하지는 않을 수도 있지만, 그것이 구체적이지 않은 것은 아닙니다. 'rand()'의 값은 "unspecified"입니까? 'getSomeInputFromTheUser()'중? No. –

2

아니요, 정의되지 않았거나 지정되지 않았습니다. 당신은 항상 같음 결과 (true 또는 false)인지 여부를 모릅니다. 그러나 프로그램에 정의되지 않은 동작이 있거나 결과가 "지정되지 않은 값"에 해당한다는 것을 의미하지는 않습니다 ".

간단히 말해서, 이것은 rand() 또는 심지어 &someVariable으로의 호출과 같은 UB와 같습니다.

+1

는 랜드'에 대한 호출()'확실히 내가 불특정 분류 할 무언가이다. – Mankarse

+0

@Mankarse :'rand()'의 의미는 어떤 식 으로든 구현 정의되지 않습니다. "지정되지 않음"에 대한 정의에 따라 시스템에서 입력을받는 프로그램은 지정되지 않은 값을 얻습니다. 지정되지 않은 _using_ 값은 UB임을 기억하십시오. 이것은 아닙니다. 당신이 인용 한 정의가 "가치"가 아니라 "행동"이라고 말하는 것에 유의하십시오. 이 동작은 표준에 의해 완전히 정의되었으므로 적용되지 않습니다. –

+0

나는 "지정되지 않은 가치"또는 "구현 정의"라고 말한 적이 없으며 "불특정적인 행동"이라고 말했습니다. 이 세 용어는 다른 의미를 가지고 있습니다. 회신하기 전에 제가 말하는 것을 읽어주십시오. 이 구현에 따라, 오히려 (사용자로부터 그리고 ... 깜짝 깜짝 ... 입력) 실행 환경에 있지 않기 때문에 – Mankarse

관련 문제