11월 초에 C++0x와 관련된 회의가 있었습니다. 관련된 이야기를 정리한 글이 있어서 한글로 정리해봅니다.

 

클래스 멤버의 기능에 대한 attribute가 키워드로

언어의 기능은 특별한 문법을 주는 것이 적합하다는 사상에서 나왔다.

 

struct Base

{

   virtual void f() { }

   int x ;

} ;

 

struct Derived final explicit : Base

{

   virtual void f() override { }

   int x new ;

} ;

 

위 코드는 기능적으로 attribute에서 제공하던 것과 같다. 다만 base_check 대신에 explicit를 사용하고, hiding 대신에 new를 사용하는 것으로 바뀌었다.

C++0x에서 멤버 선언에 initializer를 기술할 수 있으므로 다음과 같이 된다.

struct Derived final explicit : Base

{

   virtual void f() override { }

   int x new = 0;

} ;

 

참고로 위에서 사용한 키워드 new는 진짜 키워드가 아니다. 문맥의존 키워드(contextual keyword)라고 부르는 것이다. 즉 어떤 장소에서만 키워드로서 취급되는 것이다. 이것에 의해 final, override라는 identifier를 사용할 수 있다. 이것은 하위 호환성을 위한 배치이다. 이 키워드들이 사용하는 경우는 식별자를 쓸 수 없는 경우이므로 구현이 가능하고 contextual keywork는 이미 C#에서 사용된 적이 있다.

 

 

 

암묵적인 복사 생성자 문제

표준 위원회 멤버 중 David Abrahams는 암묵적인 move는 심각한 호환성 문제가 생기므로 만들지 않아야 한다고 주장했는데 Bjarne Stroustrup은 암묵적 복사에서도 문제는 같다고 주장해서 격전이 벌어졌지만 결과적으로는 Bjarne가 이겼다.

그래서

 

암묵적 복사 생성자는 유저 정의 소멸자가 있는 경우 생성된다. 이것은 deprecated이다,

 

struct X

{

    ~X() { } // 유저 정의 소멸자

} ;

 

int main()

{

    X a ;

    X b = a ; // 경고! deprecated!

}

 

구조체 X는 소멸자를 정의했기 때문에 암묵적으로 복사 생성자가 만들어진다. 그런데 복사 생성자를 명시적으로 정의하지 않았기 때문에 이것은 deprecated이다. deprecated라는 것은 장래에는 규격에서 삭제될 수도 있다라는 것이다. 위의 코드는 아래와 같이 하는 것이 좋다.

 

struct X

{

    X( X const & ) = default ; // 명시적인 default

    ~X() { } // 유저 정의 소멸자

} ;

 

int main()

{

    X a ; X b ;

    a = b ; // 올바른 코드

}

 

 

이번 회의에서는 또 유저 정의 move 생성자, move 대입 연사자가 있는 경우에도 암묵적인 복사 생성자가 만들어진다고 정했다. 하지만 앞서 이야기 했듯이 이것은 deprecated이므로 올바른 C++ 프로그래머라면 암묵적인 복사 생성자가 만들지 않도록 해야 한다.

 



 

참고 : http://cpplover.blogspot.com/2010/11/c0x.html

 

 

by 흥배 2010.12.07 09:00