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