const void 란 무엇입니까?


89

std::is_void상태에 대한 설명 :

T가 void, const void, volatile void 또는 const volatile void 형식 인 경우 true와 동일한 멤버 상수 값을 제공합니다 .

그런 다음 무엇을 할 수있는 const void, 또는 volatile void?

이 답변const void반환 유형이 유효하지 않을 것이라고 말합니다 (그러나 VC ++ 2015에서 컴파일됩니다)

const void foo() { }

표준에 따라 const void유효하지 않은 경우 (VC가 잘못됨)-다음은 무엇 const void입니까?


15
당신이 연결하는 대답은 그것이 유효하지 않다고 말하는 것이 아니라 "무의미하다"라는 것을 의미합니다. 이것은 " void없이는 어떤 혜택도 제공하지 않는다"는 뜻 const입니다.

@hvd, 대답은 컴파일러가 그러한 자격에 대해 경고 / 오류를해야한다고 말합니다. 그것에 의해 나는 C ++ 표준이 자격을 허용하지 않는다고 가정합니다void
Ajay

2
대답은 컴파일러가 그러한 자격에 대해 경고해야하며 오류를 언급하지 않으며 오류가 잘못 될 것이라고 말합니다. 그 발언은 준수에 관한 것이 아니라 구현의 품질에 관한 것이지만 발언 자체에서 전혀 명확하지 않다는 것을 이해할 수 있습니다.

@Ajay 표준은 의미없는 코드를 사용할 때 경고가 있어야한다고 지정하지 않습니다. 이 코드가 아무 일도하지 않는다는 추가 힌트를 제공하는 것은 gcc의 결정이었습니다. 그러나 VC는 어떤 식 으로든 잘못되지 않았습니다.
user1942027

3
@Ajay 대답은 clang이 경고를 제공하며 작성자의 의견으로는 다른 컴파일러가해야한다고 말합니다. 표준에서 허용하지 않으면 경고가 아니라 오류입니다.
molbdnilo

답변:


94

const void포인터를 형성 할 수있는 유형입니다. 일반적인 void 포인터와 비슷하지만 변환은 다르게 작동합니다. 예를 들어 a const int*는으로 암시 적으로 변환 될 수 없지만 암시 적 void*으로 const void*. 당신이있는 경우 마찬가지로, const void*당신은 할 수 없습니다 static_cast그것이로 int*,하지만 당신은 할 수 static_cast그것으로 const int*.

const int i = 10;
void* vp = &i;                           // error
const void* cvp = &i;                    // ok
auto ip = static_cast<int*>(cvp);        // error
auto cip = static_cast<const int*>(cvp); // ok

4
귀하의 대답은 좋지만의 이유를 설명 const void하지는 않지만 모든 주변의 void 및 non-void 포인터 [with (non-) const-ness]를 사용합니다.
Ajay

26
@Ajay : 동의하지 않습니다. A const void*는 당신이 볼 수있는 유일한 이유 const void입니다. 템플릿 인수로 전달 될 수 있지만 해당 인수 유형은 *끝에 있는로만 인스턴스화됩니다 .
Benjamin Lindley

또한 볼 수 있습니다 @BenjaminLindley const void질문 언어 변호사에 의해 요청
cpplearner

3
@Ajay : 어느 시점에서이 질문은 철학 질문이됩니다. 의 "이유"는 const voidC ++의 모든 유형을 만들 수 있다는 것 const입니다. 존재하는 것과 동일한 방식으로 "존재" void합니다. @Benjamin Lindley의 답변은 그것이 무엇인지, 그리고 그것을 어떻게 사용하는지 설명합니다.
Chris Beck

23

void, const void빈 공간 유형입니다. 그러나 const voidA는 반환 타입의이 const(! 법적이기는하지만) 의미는, 때문에 [EXPR] / 6 :

prvalue가 처음에 " cv T " 유형을 갖는 경우 , 여기서 Tcv-unqualified non-class, non-array 유형은 T추가 분석 전에 표현식 유형이 조정됩니다 .

그러나 이것은 유효한 유형 자체이며 예를 들어 C 표준 라이브러리 함수 에서 발생합니다. 여기서 인수 포인터의 const 정확성을 보장하는 데 사용됩니다 : int const*는으로 변환 할 수 void*없지만 void const*.


const void반환 유형은 함수 유형에 영향을 미치므로 완전히 의미가 없습니다.
cpplearner

1
@cpplearner 함수 의 시그니처 나 함수에 대한 호출 유형이 영향을받지 않기 때문에 모든 실제 의미에서 제외됩니다 .
Columbo

함수 템플릿의 서명을 변경할 수 있습니다. 그럼에도 불구하고 +1
cpplearner

@cpplearner 충분히 공정합니다-그래도 여전히 키 입력 낭비입니다.
Columbo

일반적으로 const int *는 void *로 갈 수 없지만 const void *.
mgouin

18

유형은 템플릿의 결과 일 수 있습니다. 템플릿은 상태가 const T될 수 있으며로 인스턴스화 T됩니다 void.

연결된 대답은 비 템플릿 유형의 특수한 경우를 고려하여 오해되거나 제한적이며 의미const void 가 없을 수도 있지만 유효한 코드 입니다.

당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.