2014-11-22 8 views
2

전적으로 전반적인 프로그래밍에 익숙합니다.void와 C++의 다른 불완전한 형식의 주요 차이점은 무엇입니까?

언어의 공식 표준 읽기를 시도했지만 내 질문에 대한 답을 찾을 수 없습니다.

그래서 void 형식과 C++의 다른 불완전한 형식 간의 주요 차이점을 이해해야합니다. 예를 들어, 언어 (또는 코드)에서 void를 사용할 수 있지만 다른 불완전한 유형은 사용할 수없는 장소가 있습니까? 아니면 모든면에서 다른 불완전한 유형과 마찬가지로 무효입니까?

+2

왜 특히 이해해야합니까? – hobbs

+0

참고로이 표준은 자습서가 아닙니다. 그러나 질문에 모호하지 않은 대답을 얻는 가장 좋은 방법입니다. –

+0

분명히 당신이 찾고있는 것은 아니지만,'(void)'는 사용되지 않는 변수에 대한 경고음을 없애기 위해 사용될 수 있습니다. 내가해야하기 때문에 –

답변

8

무효 및 다른 불완전한 유형 사이의 아주 미묘한 차이가 실제로있다 :

struct T;  // incompletely defined type 
       // incompletely defined types and void are incomplete types 
T* x=nullptr; // pointer to incomplete type are valid, same for void pointers 
T& tref=*x;  // it's valid to have a reference to an incompletely defined type 
void& vref;  // it's INVALID to have a reference to void, because no object could ever be void 

int f(void &vt); // INVALID function declaration with invalid parameter: void reference 
int g(T& vt);  // valid function declaration using a parameter: reference to incomplete type 

C++ 표준은 인용 :

당신은 공공 형에 대한 참조를 가질 수 없습니다

3.9/5 : 선언되었지만 정의되지 않은 클래스 또는 알 수없는 크기 또는 불완전한 요소 유형의 배열은 입니다. ncompletely-defined 오브젝트 유형. 개체 유형 를 불완전하게 정의 된 보이드 종류 불완전한 유형

3.9/8이다 : 오브젝트 타입 (아마도 CV 수식) 그 기능 유형이 아닌 기준 유형이 아닌, 그리고 일종 void 형.

8.3.2/1 : 형식 "cv void에 대한 참조"를 지정하는 선언자가 잘못되었습니다. 이것은 C++ 표준에 설명되어 있습니다

(void)(3 + 5); // OK explicit conversion to void 
(T)(3 + 5);  // Invalid expression to an incomplete type 

:

3.9

분명히 다른 불완전한 유형의 경우에는 해당되지 않습니다있는 어떤 표현이 무효로 변환 할 수 있습니다 .1/9 : 모든 표현식을 명시 적으로 cv 형식으로 변환 할 수 있습니다. void

+0

나는 이것을 표준에서 찾았지만, 불행히도, 당신의 설명과 예들없이 나는 그것들을 이해할 수있을 것이라고 생각하지 않는다. 그것은 너무 복잡하고 내 의견으로는 잘 쓰여 있지 않습니다. 감사! – user3776836