13. 초기화 문법의 함정 ({} vs (), initializer_list 우선, MVP, narrowing)

난이도 중 해설 보기 →

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

결함 코드 · C++
// 주제: 초기화 문법의 함정 — 중괄호 {} vs 소괄호 (), std::initializer_list 우선순위,
//       aggregate(집합체) 초기화, 값 초기화, 그리고 (컴파일은 안 되지만) most vexing parse·narrowing.
//
// 아래 각 변수의 크기/내용을 예측하라. 특히 a 와 b, c 와 d 가 왜 갈리는지,
// std::string t{5,'x'} 가 무엇이 되는지 설명하라.
// 또한 답안에서 다음 두 가지가 왜 함정인지도 설명하라:
//   (i)  Widget w();        // 변수가 아니라 함수 선언이 되는 경우(most vexing parse)
//   (ii) int n{3.5};        // 중괄호에서 거부되는 변환(narrowing)

#include <cstdio>
#include <vector>
#include <string>

struct Point { int x; int y; };   // aggregate

int main() {
    std::vector<int> a(3, 7);   // (a)
    std::vector<int> b{3, 7};    // (b)
    std::vector<int> c(3);       // (c)
    std::vector<int> d{3};       // (d)
    std::printf("a.size=%zu a[0]=%d\n", a.size(), a[0]);
    std::printf("b.size=%zu b[0]=%d\n", b.size(), b[0]);
    std::printf("c.size=%zu c[0]=%d\n", c.size(), c[0]);
    std::printf("d.size=%zu d[0]=%d\n", d.size(), d[0]);

    Point p{1, 2};               // (p) 집합체 초기화
    Point q{};                   // (q) 값 초기화
    std::printf("p=(%d,%d) q=(%d,%d)\n", p.x, p.y, q.x, q.y);

    std::string s(5, 'x');       // (s)
    std::string t{5, 'x'};       // (t)  <-- 무엇이 되나?
    std::printf("s='%s' len=%zu\n", s.c_str(), s.size());
    std::printf("t len=%zu first=%d second=%d\n", t.size(), (int)t[0], (int)t[1]);
    return 0;
}
내 리뷰 · C++
내 답안 · 자동 저장

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