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++
내 답안 · 자동 저장

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