void (* pFunc_pcInt) (int const *) = nullptr ;
void (* pFunc_pInt) (int *) = reinterpret_cast< void (*) (int *) >(pFunc_pcInt) ;
이러한 변환으로 인해 정의되지 않은 동작이 발생합니까? standard (작업 초안 강조 광산) 에서뿐만매개 변수의 추가 자격을 제외하고 동일한 서명이있는 함수에서 포인터로 함수 포인터로 변환
void (* pFunc_pcInt) (int const *) = nullptr ;
void (* pFunc_pInt) (int *) = reinterpret_cast< void (*) (int *) >(pFunc_pcInt) ;
이러한 변환으로 인해 정의되지 않은 동작이 발생합니까? standard (작업 초안 강조 광산) 에서뿐만매개 변수의 추가 자격을 제외하고 동일한 서명이있는 함수에서 포인터로 함수 포인터로 변환
:
함수 포인터가 명시 적으로 다른 유형의 함수 포인터로 전환시킬 수있다. [참고 : 함수 정의에 사용 된 유형과 다른 함수 유형 ([dcl.fct])에 대한 포인터를 통해 함수를 호출 할 때의 결과는 정의되지 않습니다.. - 끝말] [...]
그리고 물론 void(int const *)
과 void(int *)
은 다른 유형입니다. 유사한
뭔가 가장 알려진 online reference (강조 광산) 중 하나에서 온다 : 함수
모든 포인터가 다른 함수 타입에 대한 포인터로 변환 할 수 있습니다. 다른 함수 유형에 대한 포인터를 통해 함수를 호출하면이 정의되지 않지만 이러한 포인터를 원래 함수 유형에 대한 포인터로 다시 변환하면 원래 함수에 대한 포인터가 생성됩니다.
구체적인 경우에는 nullptr
을 함수 포인터에 지정 했으므로 그다지 중요하지 않습니다. 어떤 경우이든 호출하면 오류가 발생합니다.
그렇다면 올바른 함수 포인터를 pFunc_pcInt
에 할당 한 경우 변환 포인터 pFunc_pInt
을 통해 호출하는 것이 UB 였을 것입니다.
나는 아주 무관 한 절의 어딘가에 숨겨진 예외와 같은 것에 대해 생각했지만, 그런 경우는 아닙니다. –
@GreenTree : 많은 C 컴파일러, 특히 임베디드 또는 시스템 프로그래밍을위한 C 컴파일러는 호출 된 함수가 요구하는 방식으로 호출 코드가 설정되는 경우에 암시 적으로 동작을 정의하는 방식으로 호출 규칙을 명시 적으로 문서화합니다. 이름 맹 글링 (mangling)과 다른 문제로 인해, 함수와 포인터가'extern "C"{...} "로 선언 될 때를 제외하고는 호출 규칙이 C++에서 지정되지 않을 가능성이 더 높습니다. – supercat
@supercat, 당신은 정확히 "호출 규칙이 C++에서 불특정하게 될 가능성이 더 높다"는 것을 의미합니까? 그리고 전화 협약은 이름 맹 글링과 어떻게 관련이 있는가? –