인프런 커뮤니티 질문&답변

Learn님의 프로필 이미지
Learn

작성한 질문수

홍정모의 따라하며 배우는 C++

9.12 이니셜라이져 리스트 initializer list

타입 불일치 오류

작성

·

197

0

#include <iostream>
#include <cassert>
#include <initializer_list>

class IntArray {
private:
    unsigned int m_length{ 0 };
    int* m_data = nullptr;

public:
    IntArray(unsigned length)
        :m_length(length) {
        m_data = new int[length];
    }
    
    // ERROR: C4267 - 'argument': conversion from 'size_t' to 'unsigned int', possible loss of data
    IntArray(const std::initializer_list<int>& list)
        :IntArray(list.size()) {
        unsigned int count{ 0 };
        for (auto& element : list) {
            m_data[count++] = element;
        }
    }

    ~IntArray() {
        delete[] this->m_data;
    }
};

int main() {
    IntArray int_array{ 0,1,2,3,4 };
}

 

안녕하세요.

MSVS debug x64 에서 빌드하면 이런 오류가 나옵니다.

 

----

C4267 : 'argument' - conversion from 'size_t' to 'unsigned int', possible loss of data

----

 

dubug x86 에서는 오류가 안나오네요.

이유가 궁금합니다. 감사합니다.

답변 1

0

안녕하세요

Warning이 뜨는 이유는 라인 마지막에 있는 list.size() 에서

std::size의 반환 값이 size_t 형이라 그렇습니다.

size_t는 x64일때 unsigned __int64(8byte), x86에서는 unsigned int(4byte)로 typedef되어있습니다.

그래서 x64에서 빌드하면 8byte 값이 4byte로 conversion되면서 소실될 수 있다고 Warning이 나오게 됩니다. 

이후 강의에 size_t가 자세히 언급됩니다. 

Learn님의 프로필 이미지
Learn

작성한 질문수

질문하기