
項目 21:new の直接使用よりも std::make_unique や std::make_shared を優先する
|
143
auto spv = std::make_shared<std::vector<int>>(10, 20);
上例を実行した結果として生成されるスマートポインタが指すものは、2 つとも値を 20 とする要
素が 10 個ある std::vector でしょうか、それとも要素数は 2 で、それぞれの値が 10 と 20 である
std::vector でしょうか? または、非決定的な動作結果になるのでしょうか?
良いニュースです。この動作は非決定的ではなく、いずれも全要素の値が 20 で要素数が 10 の
std::vector を作成します。このことから、make 関数内の完全転送コードは波括弧ではなく丸括
弧を使用していることが分かります。悪いニュースもあります。波括弧による初期化を用い対象オ
ブジェクトを作成したければ、new を直接使用しなければならないのです。make 関数の使用は波括
弧による初期化子を完全転送する機能を必要としますが、項目 30 でも述べるように波括弧による初
期化子は完全転送できません。項目 30 ではその対応策も述べており、まず波括弧による初期化によ
り std::initializer_list オブジェクトを作成しますが(項目 2 を参照)、この際に auto による
型推論を利用します。auto で作成したこのオブジェクトを make ...