일반적으로 기능을 사용할 수 없게 만드는 것을 의미합니다. 예를 들어 프로그램에서 동적 할당 사용을 금지하려는 경우 해당 기능을 사용할 수 없도록 "중독" malloc
할 수 있습니다.
비디오에서 그는 그것을 좀 더 구체적인 방식으로 사용하고 있습니다. "컴파일 타임만을 강제하는 방법?"이라고 말하는 함수 중독에 대해 이야기 할 때 표시되는 슬라이드를 읽으면 분명합니다.
그래서 그는 런타임에 호출 할 수 없도록 함수를 "중독"하는 것에 대해 이야기하고 있습니다. 따라서 상수 표현식 에서만 호출 할 수 있습니다. 이 기술은 컴파일 타임 컨텍스트에서 호출 될 때 절대로 취해지지 않는 함수에 분기를 포함하고 해당 분기에 오류를 발생시키는 무언가를 포함하도록 만드는 것입니다.
throw
이 함수의 컴파일시 호출시에 도달하지 못했다대로 (당신이 컴파일시에 예외를 던질 수 없기 때문에 메모리 할당과 같은 본질적으로 역동적 인 동작의) 표현은 한하는 constexpr 기능에 허용됩니다. 따라서 정의되지 않은 기호를 참조하는 throw 표현식은 컴파일에 실패하기 때문에 컴파일 타임 호출 중에 사용되지 않으며 정의되지 않은 기호로 인해 링커 오류가 발생하기 때문에 런타임에 사용할 수 없습니다.
정의되지 않은 심볼은 함수의 컴파일 타임 호출에서 "odr-used"가 아니기 때문에 실제로 컴파일러는 심볼에 대한 참조를 생성하지 않으므로 정의되지 않은 것이 좋습니다.
유용합니까? 그는 그것을 수행 하는 방법 을 시연 하고 있으며 반드시 그것이 좋은 아이디어이거나 널리 유용하다고 말하는 것은 아닙니다. 어떤 이유로 든 할 필요가 있다면 그의 기술이 문제를 해결할 수 있습니다. 그럴 필요가 없다면 걱정할 필요가 없습니다.
유용 할 수 있는 한 가지 이유 는 일부 작업의 컴파일 타임 버전이 효율적이지 않을 때입니다. constexpr 함수에서 허용되는 식의 종류에는 제한이 있습니다 (특히 C ++ 11에서는 일부 제한이 C ++ 14에서 제거됨). 따라서 계산을 수행하기위한 두 가지 버전의 함수가있을 수 있습니다. 하나는 최적이지만 constexpr 함수에서 허용되지 않는 표현식을 사용하는 것이고 다른 하나는 유효한 constexpr 함수이지만 실행시 호출되면 성능이 저하됩니다. 시각. 차선책을 감염시켜 런타임 호출에 사용되지 않도록하여 런타임 호출에보다 효율적인 (비 constexpr) 버전이 사용되도록 할 수 있습니다.
NB 컴파일 타임에 사용되는 constexpr 함수의 성능은 어쨌든 런타임 오버 헤드가 없기 때문에 그다지 중요하지 않습니다. 컴파일러가 추가 작업을 수행하도록하여 컴파일 속도를 늦출 수 있지만 런타임 성능 비용은 발생하지 않습니다.