48. 클래스 템플릿 인자 추론(CTAD)과 추론 가이드
난이도 상 해설 보기 →
결함을 모두 찾고 원인·수정안·더 나은 설계를 제시하라. 마커
(A)(B) 는 주목 위치 힌트다.
결함 코드 · C++
// 주제: 클래스 템플릿 인자 추론(CTAD, Class Template Argument Deduction, C++17)과
// 사용자 정의 추론 가이드(deduction guide).
//
// 과제:
// 1) 아래 각 변수의 "추론된 템플릿 인자"가 무엇인지 예측하라(예: std::vector<int>).
// 2) 프로그램의 표준출력(각 줄)을 정확히 예측하라.
// 3) v1{5,5} 와 v2(5,5) 가 왜 다른 컨테이너가 되는지,
// Wrapped w{"hi"} 가 왜 std::string 을 담게 되는지(추론 가이드) 내부 규칙으로 설명하라.
// (동작·추론 규칙에 대한 설명은 answer.md 에만 있다. 여기서는 예측만 요구한다.)
//
// 컴파일: g++ -std=c++17 -O2 problem.cpp && ./a.out
#include <iostream>
#include <vector>
#include <utility>
#include <string>
#include <type_traits>
template <class T>
struct Wrapped {
T value;
explicit Wrapped(T v) : value(std::move(v)) {}
};
// 추론 가이드: 생성자 인자가 const char* 이면 T 를 std::string 으로 추론한다.
Wrapped(const char*) -> Wrapped<std::string>;
int main() {
std::pair p{1, 2.5}; // (1)
std::vector v1{5, 5}; // (2) 중괄호 목록
std::vector v2(5, 5); // (3) 괄호 생성자
Wrapped w{"hi"}; // (4) 추론 가이드 적용
std::cout << std::boolalpha;
std::cout << std::is_same_v<decltype(p), std::pair<int, double>> << "\n"; // L1
std::cout << v1.size() << "\n"; // L2
std::cout << v2.size() << "\n"; // L3
std::cout << std::is_same_v<decltype(w), Wrapped<std::string>> << "\n"; // L4
std::cout << w.value.size() << "\n"; // L5
return 0;
} 내 리뷰 · C++
내 답안 · 자동 저장
작성 후 위 해설 보기에서 모범 해설과 대조하세요.