developer tip

const void의 요점은 무엇입니까?

copycodes 2020. 12. 9. 08:22
반응형

const void의 요점은 무엇입니까?


분명히 const void다음을 반환하는 함수를 선언 할 수 있습니다 .

const void foo()
{
}

g ++ const는 다음 코드가 컴파일되지 않기 때문에 중요한 것을 고려하는 것 같습니다 .

#include <type_traits>

static_assert(std::is_same<void(), const void()>::value, "const matters");

그래서 const void실질적인 의미가 있습니까?


별로. 그러나 void에 대한 cv -qualifications 를 무시 하거나 오류를 만들면 컴파일러 구현 및 최종 사용자 코드 측면에서 불필요한 복잡성이 발생할 수 있습니다. 다음과 같은 템플릿 고려

  template<typename T>
  const T ...

이 시나리오에서 void를 사용하는 특별한 경우 (이미있는 것보다 더 많은 경우)를 만들 이유가 없습니다. 두통을 유발할뿐입니다.

또한 const void도움이되지는 않지만 const void*그 용도가 있습니다.


const void 컴파일러가 일반적인 규칙에 대한이 예외를 쫓아 내도록 만드는 이유가없고 그대로 두어도 해가되지 않기 때문에 허용됩니다.

위에 const void*그다지 유용하지 않은 몇 가지 논의가 있습니다 .

const void *는 얼마나 유용합니까? 나는 void * const가 얼마나 될 수 있는지 볼 수 있지만 전자는 아닙니다. – 스피디

사실 const void*때로는 필수적입니다. void* const포인터 자체가 일정하다고 선언하고 가리키는 것은 아니라고 선언하는 것과는 반대로 가리키는 것은 읽기 전용임을 선언합니다.

내 경험으로 볼 때 상수 사용에 대한 포인터 const void*는 두 가지 형식 중 더 유용합니다. 물론 const void* const포인터와 그것이 가리키는 것 모두 일정하다는 의미도 있습니다.

void*일반적으로 비 특정 포인터를 전달하는 방법으로 사용됩니다 (예 :) memcpy(). const char*그러한 함수에 a를 전달 하려면 사용할 수 없거나 void*가리키는 것이 일정하고 변경할 수 없다는 사실을 잃게됩니다. 현재의 C ++ 컴파일러는 암시 적으로 캐스트해야하기 때문에 컴파일을 거부 할 것이며 const,이 데이터가 읽기 전용 메모리에있을 수 있고 무언가 쓰기를 시도 할 경우 예외가 발생할 수 있기 때문입니다.

이것이 두 번째 주장 memcpy()const void*단순한 것이 아니라 이유 void*입니다.

참고 URL : https://stackoverflow.com/questions/5057987/whats-the-point-of-const-void

반응형