함수에 대한 포인터를 새로 할당하는 것이 합법적입니까? 결과 포인터는

함수에 대한 포인터는 void * 포인터에 저장할 수 없으므로 일반 데이터 포인터가 아닙니다. 그럼에도 불구하고 아래 코드와 같이 함수 포인터의 사본을 동적 메모리 (gcc 및 clang)에 저장할 수있는 것 같습니다. 이러한 코드는 C ++ 표준에 따라 합법적입니까, 아니면 일종의 컴파일러 확장입니까?

또한 함수 포인터에 대한 결과 포인터는 일반 데이터 포인터처럼 작동합니다. void *에 저장하고 static_cast에 의해 void *에서 검색 할 수 있습니다. 이 행동은 표준에 의해 보장됩니까?

int main()
{
  extern void fcn();
  void (*fcnPtr)() = &fcn;
  void (**ptrToFcnPtr)() = nullptr;

  //Make the copy of fcnPtr on the heap:
  ptrToFcnPtr = new decltype(fcnPtr)(fcnPtr);
  //Call the pointed-to function : 
  (**ptrToFcnPtr)();

  //Save the pointer in void* :
  void *ptr = ptrToFcnPtr;
  //retrieve the original ptr: 
  auto myPtr = static_cast< void(**)() > (ptr) ; 
  //free memory:
  delete ptrToFcnPtr ;

}



답변

함수 포인터는 객체 포인터가 아니지만 “일부 유형의 함수에 대한 포인터”는 여전히 객체 유형 [basic.types] / 8 입니다. 따라서 함수 포인터는 그 자체가 객체이며 그들이 가리키는 것은 아닙니다.

따라서 새로운 표현식을 통해 함수 포인터 유형의 객체를 만들 수 있습니다.


답변

그것들은 (함수 포인터) void * 포인터에 저장할 수 없기 때문에.

실제로 함수 포인터를 a로 저장하는 void*것은 조건부로 지원됩니다. 이는 언어 구현에 따라 저장 될 수 있거나 저장 될 수 없음을 의미합니다. 언어 구현이 동적로드를 지원하는 경우 함수 포인터 변환 void*이 지원 될 수 있습니다. GCC, Clang 및 MSVC는 모두 다음을 지원합니다.

reinterpret_cast<void*>(&function);

함수에 대한 포인터를 새로 할당하는 것이 합법적입니까?

확실한. 함수 포인터를 포함한 모든 포인터는 객체이며 모든 객체는 동적으로 할당 될 수 있습니다.

또한 함수 포인터에 대한 결과 포인터는 일반 데이터 포인터로 작동합니다.

함수 포인터는 객체입니다. 함수 포인터뿐만 아니라 “로 동작”의 포인터,하지만 입니다 객체에 대한 포인터.

void *에 저장하고 static_cast에 의해 void *에서 검색 할 수 있습니다. 이 행동은 표준에 의해 보장됩니까?

void에 대한 포인터와 객체에 대한 포인터 사이의 변환은 허용됩니다. 그리고 왕복 변환은 원래 포인터를 생성하도록 보장됩니다.


답변