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++
내 답안 · 자동 저장
작성 후 위 해설 보기에서 모범 해설과 대조하세요.