
項目 8:0 や NULL よりも nullptr を優先する
|
53
std::vector<int> v;
…
doSomeWork<std::vector<int>>(10, 20);
doSomeWork が localObject を作成する際に丸括弧を使用すると、10 個の要素を持つ std::
vector となり、波括弧を使用すると、2 個の要素を持つ std::vector となります。正しいのはど
ちらでしょうか? doSomeWork の開発者には知る術がありません。doSomeWork の利用者にしか分
からないことです。
標準ライブラリの std::make_unique と std::make_shared はまさにこの問題に直面しており
(項目 21)、インタフェースの一部として、内部で丸括弧を使用していることを明文化しています2。
重要ポイント
•
最も広範囲に使用可能な初期化構文は波括弧による初期化である。精度が落ちる変換を防ぎ、
C++ の最も厄介な構文解析を回避できる。
•
波括弧で囲んだ初期化子は、コンストラクタのオーバロード解決時に、見た目ではより高く
一致するコンストラクタが他にあっても、仮引数が一致すれば std::initializer_list を
とるコンストラクタに解決される。
•
丸括弧か波括弧かの選択が大きな差異を生む例としては、実引数を 2 つ与えた std::vector
<numeric type> の作成がある。
•
テンプレート内でのオブジェクト作成に、丸括 ...