STEP 2 で扱った 参照・初期化・関数・namespace・pair/tuple・イテレータ の総合確認クイズです。全 12 問、カテゴリ別に採点されます。正解すると即座にスコアバーが伸び、全問終えると苦手カテゴリの分析も出ます。
int& は参照渡し。x は a への参照なので、x = 99; は a を書き換えます。値渡し void f(int x) だったら a は変わらず 1。{} 初期化は「狭める変換(narrowing)」を禁止。double → int の切り捨てはエラーにしてくれる。①と②は暗黙変換で通ってしまう(x は 3 になる)のが {} より危険な理由です。④は auto で double 型に推論されるので問題なし。nullptr はポインタ専用の特別な型(std::nullptr_t)を持ちます。NULL や 0 は整数と区別できずオーバーロード解決で誤マッチすることがあり非推奨。void f(int a, int b = 0, int c); はコンパイルできる?f(1, 2); の呼び出しで「b を省略して 2 を c に渡したのか」が決められないため。std::string を「読むだけ」で関数に渡す最も良い書き方は?const T& は「コピーなし(速い)」+「書き換え禁止(安全)」の両立。重い型を読むだけのときの既定の選択です。①は毎回コピーで遅い、②は意図せず書き換えの可能性、③はポインタで nullptr チェックが必要になり冗長。using namespace std; が本サイトで推奨されない主な理由は?count / distance / size など一般的な名前が多く、自作のシンボルと衝突する危険があります。特にヘッダファイル内で書くと、そのヘッダを include した全てに影響するので厳禁。関数スコープ内に限定するか、using std::cout; のような using 宣言なら局所的で許容される流儀。bに入る値は?auto [a, b] = p; は pair の first / second を順に a, b に取り出します。a = 42, b = 3.14 になり、出力は 3.14。C++17 以降で使える機能です。make_tuple。std::make_tuple(1, "Alice", 98.5); で tuple が作れます(型推論あり)。明示的に型を書くなら std::tuple<int, std::string, double> t{1, "Alice", 98.5};。std::vector<int> v = {10, 20, 30}; のとき、v.end() が指すのは?end() は「末尾の要素の 1 つ先」。*v.end() は未定義動作。半開区間 [begin, end) の設計が STL 全体を統一的に扱えるカギ。std::find が見つからなかったときの戻り値は?end() を返すのが STL の慣例。if (it != v.end()) でチェックします。npos は std::string::find 特有の戻り値で別物。