ABOUT ME

-

Today
-
Yesterday
-
Total
-
  • C++ 오브젝트 생성시 {}와 () =의 구분
    프로그래밍/c++ 2015. 2. 2. 00:07
    반응형

    C++11에서의 초기화 방법들은 다음과 같은것이 있다.


    int a = 0;

    int a(0);

    int a{0};


    여기에서 int a = { 0 } 이와 같은 문법은 {}만 같이 쓴거처럼 처리된다. 

    즉, int a = {0} == int a{0}


    {}는 C++11부터의 초기화 문법으로, {}를 사용하는 초기화를 유니폼 초기화(uniform initialization)라고 한다. 


    * 모든 non static value의 초기화는 {}를 이용해서 가능하다


    class widget

    {

      int a(0); // error

      int b{0}; // ok

      int c = 0; // ok
    };


    * 복사가 안 되는 오브젝트에 대해서는 ()는 되지만 =는 안 된다.


    std::atomic<int> a{0}; // ok

    std::atomic<int> b(0); // ok

    std::atomic<int> c = 0; // error


    * 줄어듦 변환에 대한 코드를 용납하지 않는다.


    double a = 0.7f;

    int b{ a }; // error


    * 유니폼 초기화의 약점


    초기화리스트(std::initializer_list)를 사용하는 생성자가 있을시 컴파일러는 최대한 초기화리스트에 맞춘 생성자를 호출하려고 한다. (더 완벽한 생성자가 있음에도!)


    class widget

    {

    public:

            widget(int i, bool b); 

            widget(int i, double d);

            widget(std::initializer_list<bool> il);      

    };


    widget a{ 7, true }; 


    이 코드 역시 초기화리스트 생성자를 호출하려한다.(내부적으로 타입들을 long double로 변환을 해서까지!)

    하지만 유니폼초기화는 줄어듦 변환을 허용하지 않으므로 결국 컴파일 에러가 발생한다.



    반응형

    '프로그래밍 > c++' 카테고리의 다른 글

    std::copy의 반환 값  (0) 2015.02.19
    scanf_s  (0) 2015.02.08
    C++11 가변 인자 템플릿의 사용 예  (0) 2014.06.29
    [C++]std::addressof의 존재 이유  (2) 2014.06.29
    알아볼 c++11 문법  (0) 2014.05.16
Designed by Tistory.