auto convert? auto casting? CPP에서 암시적 casting에 대해서.

조회수 681회
Constant *putsFunc = module->getOrInsertFunction("puts", putsType);

이런 코드가 있는데요. 이렇게 작성하게 되면, 오른쪽의 반환타입이 왼쪽의 반환타입으로 자동으로 casting이 되더라고요?

C언어 에서는 보통 저런 implicit 한걸 제공하지 않는걸로 기억하고 있습니다. 캐스팅을 할려면 꼭

int a = 8.23f;

int b = (int)8.24f;

a는 안되고, b로 해야하는걸로 알고 있습니다.

Cpp 에서는 implict한 type casting 을 제공하는건가요?

혹시 잘 정리된 문서가 있다면 링크를 알 수 있을까요?

1 답변

  • 좋아요

    0

    싫어요
    채택 취소하기

    C++의 암시적 변환 규칙은 조금 복잡한면이 있지만 대부분의 객체 지향 언어와 유사하고 이를 더 확장하고 있습니다.

    C언어와 같이 기본 타입에 대한 암시적 변환을 지원합니다. 역시 const, volatile, const volatile와 같은 한정자에 대한 변환은 유사합니다. 그외에 클래스 간 상속 관계를 통한 업캐스팅이 가능합니다. 포인터간 변환은 업캐스팅이 아니라면 암시적 변환이 이루어지지 않습니다.

    여기 까지는 변환에 대해서 큰 복잡함은 없으나 사용자 정의 변환을 지원하고 있기에 자유도가 높으나 복잡해지는 면이 있습니다.

    예를 들어 아래와 같이 클래스의 operator int()와 같이 변환 연산자를 작성할 수 있습니다.

    struct Integer {
        std::string literal;
        operator int() const { return std::stoi(liternal); }
    };
    Integer raw = {"1234"};
    int value = raw;
    

    본론으로 넘어와서 아래 코드에 대한 내용을 설명하보겠습니다.

    Constant *putsFunc = module->getOrInsertFunction("puts", putsType);

    getOrInsertFunction()의 반환형이 Constant*으로 변환되었다 하셨는데, 자세하 타입을 설명을 안해 주셔서 찾아보았습니다.

    FunctionCallee getOrInsertFunction(StringRef Name, FunctionType *T);

    해당 코드는 LLVM에서 작성된 코드로 보여 관련 클래스 설명을 보니 getOrInsertFunction()FunctionCallee을 반환 하도록 되어 있었습니다. FunctionCallee의 상속 관계나 사용자 변환은 Constant와 관련이 없기에 변환이 불가능합니다.

    하지만 해당 코드가 가능했기에 질문을 주신걸 테고 검색도 되는 것이라 생각이 들어 LLVM 버전을 찾아 보았습니다. 해당 코드는 대략 LLVM 3에서 사용되던 코드로 보이며, 관련 문서를 찾기가 어려워 소스코드를 확인해 보았습니다.

    이 곳을 보시면 다음고 같이 함수가 선언되어 있습니다.

    Constant *getOrInsertFunction(StringRef Name, FunctionType *T);

    즉, getOrInsertFunction()Constant*를 반환하고 있기에 질문 주신 코드가 정상 동작 하는 것입니다. 동일한 타입을 반환하고 동일한 타입으로 변수에 대입하니 별다른 변환이 이루어지지 않습니다.

답변을 하려면 로그인이 필요합니다.

프로그래머스 커뮤니티는 개발자들을 위한 Q&A 서비스입니다. 로그인해야 답변을 작성하실 수 있습니다.

(ಠ_ಠ)
(ಠ‿ಠ)