-
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