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을 허용하게 된다는 점에 유의하자.