12. 오버로드 해석과 암시적 변환 순위, ADL

난이도 최상 해설 보기 →

결함을 모두 찾고 원인·수정안·더 나은 설계를 제시하라. 마커 (A)(B) 는 주목 위치 힌트다.

결함 코드 · C++
// 주제: 오버로드 해석(overload resolution) · 암시적 변환 순위 · ADL(인자 의존 탐색).
//
// 아래 각 호출에서 "어떤 오버로드가 선택되는지" 예측하고, 그 이유를
// 변환 순위(정확한 일치 > 승격 > 표준 변환 > 사용자 정의 변환)와
// 템플릿/비템플릿 우선순위, ADL 규칙으로 설명하라.
//
// 특히 h("hello") 가 어디로 가는지, k(42) 와 k(42.0) 이 갈리는 이유,
// g(nullptr) 와 g(0) 의 차이를 정확히 짚어라.

#include <cstdio>
#include <string>

void f(int)    { std::printf("f(int)\n"); }
void f(double) { std::printf("f(double)\n"); }

void g(int)    { std::printf("g(int)\n"); }
void g(void*)  { std::printf("g(void*)\n"); }

void h(bool)               { std::printf("h(bool)\n"); }
void h(const std::string&) { std::printf("h(const std::string&)\n"); }

template <class T> void k(T) { std::printf("k(T) template\n"); }
void k(int)                  { std::printf("k(int) non-template\n"); }

namespace game {
    struct Vec { int x; };
    void emit(const Vec&) { std::printf("game::emit(Vec) via ADL\n"); }
}

int main() {
    f(42);          // (1)
    f(3.14f);       // (2)  float 인자
    g(0);           // (3)
    g(nullptr);     // (4)
    h("hello");     // (5)  <-- 무엇이 호출되나?
    k(42);          // (6)
    k(42.0);        // (7)
    game::Vec v{1};
    emit(v);        // (8)  네임스페이스 한정 없이 호출
    return 0;
}
내 리뷰 · C++
내 답안 · 자동 저장

작성 후 위 해설 보기에서 모범 해설과 대조하세요.