답변

3

:

함수 포인터가 명시 적으로 다른 유형의 함수 포인터로 전환시킬 수있다. [참고 : 함수 정의에 사용 된 유형과 다른 함수 유형 ([dcl.fct])에 대한 포인터를 통해 함수를 호출 할 때의 결과는 정의되지 않습니다.. - 끝말] [...]

그리고 물론 void(int const *)void(int *)은 다른 유형입니다. 유사한

뭔가 가장 알려진 online reference (강조 광산) 중 하나에서 온다 : 함수

모든 포인터가 다른 함수 타입에 대한 포인터로 변환 할 수 있습니다. 다른 함수 유형에 대한 포인터를 통해 함수를 호출하면이 정의되지 않지만 이러한 포인터를 원래 함수 유형에 대한 포인터로 다시 변환하면 원래 함수에 대한 포인터가 생성됩니다.

구체적인 경우에는 nullptr을 함수 포인터에 지정 했으므로 그다지 중요하지 않습니다. 어떤 경우이든 호출하면 오류가 발생합니다.
그렇다면 올바른 함수 포인터를 pFunc_pcInt에 할당 한 경우 변환 포인터 pFunc_pInt을 통해 호출하는 것이 UB 였을 것입니다.

+0

나는 아주 무관 한 절의 어딘가에 숨겨진 예외와 같은 것에 대해 생각했지만, 그런 경우는 아닙니다. –

+0

@GreenTree : 많은 C 컴파일러, 특히 임베디드 또는 시스템 프로그래밍을위한 C 컴파일러는 호출 된 함수가 요구하는 방식으로 호출 코드가 설정되는 경우에 암시 적으로 동작을 정의하는 방식으로 호출 규칙을 명시 적으로 문서화합니다. 이름 맹 글링 (mangling)과 다른 문제로 인해, 함수와 포인터가'extern "C"{...} "로 선언 될 때를 제외하고는 호출 규칙이 C++에서 지정되지 않을 가능성이 더 높습니다. – supercat

+0

@supercat, 당신은 정확히 "호출 규칙이 C++에서 불특정하게 될 가능성이 더 높다"는 것을 의미합니까? 그리고 전화 협약은 이름 맹 글링과 어떻게 관련이 있는가? –