union에서의 객체 사용
표준 C++에서는 union에서 사용할 수 있는 객체에 제한이 있었나보다. [1]
아래와 같은 코드를 컴파일 했더니,
struct Point { int _x; Point(); Point(int x):_x(x){}; }; typedef struct { CStr strUserInput; union { double dValue; bool bValue; int32 nValue; Point p; }value; }Prop; |
error C2620: member '<unnamed-tag>::p' of union '<unnamed-tag>::<unnamed-tag>' has user-defined constructor or non-trivial default constructor
위와 같은 에러가 난다.
사용자 정의 생성자나 non-trivial 기본 생성자를 사용하는 객체이기 때문이라는 것이다.
여기서, trivial이라는 의미를 찾아보니,
trivial 생성자/소멸자는 '아무것도 하지 않는' 이란 의미이며, trivial 복사 생성자는 메모리 복사와 같은 역할을 하는 의미(즉, memcpy와 같은 의미)이다.
만약 생성자를 정의했지만, '아무것도 하지 않는' 생성자를 정의해도 non-trivial이 된다. 그래서 trivial 생성자는 컴파일에의해서 암시적으로 생성되어야 한다. [2]
[1]의 블로그에 따르면, C++0x가 되면서 위의 코드가 가능해진다고 한다. (아직 미확인 ㅠ)
좀 더 세부적인 내용은 [1]의 블로그로 가서 좀더 내용을 확인하세요~
<참조>
1.http://blog.naver.com/PostView.nhn?blogId=sorkelf&logNo=40137890578
2. http://stackoverflow.com/questions/3899223/what-is-a-non-trivial-constructor-in-c