C++
Uniform Initialization와 std::initializer_list
Elan
2023. 8. 29. 12:03
Uniform Initialization
Uniform Initialization은 C++11 이상에서 권장하는 초기화 방식이다.
struct Point
{
Point(const float x, const float y): x(x), y(y)
{
}
float x, y;
};
만약 위 Point 객체를 전통적인 초기화 방식을 사용할 경우 Narrowing Conversion(정보의 손실이 있는 형변환)이 허용된다.
그러나 중괄호 { } 를 이용한 Uniform Initialization을 사용하면 이를 허용하지 않아 좀 더 타입 안정성을 높일 수 있다.
int main()
{
int a=1, b=2;
Point point1(a,b); // int타입이 float 타입으로 묵시적 형변환을 허용한다
Point point2{a,b}; // C2398 : conversion from int to const float requires a narrowing conversion
}
또한 다음과 같이 std::initializer_list를 사용한 초기화가 가능하게 된다.
int main()
{
std::vector<Point> points{{1,2},{3,4}};
}
그런데 모순적이게도 std::initializer_list를 사용할 경우 Narrowing conversion을 허용하게 된다는 점에 유의하자.