

C++の

[code]

    vector<int> u;
    u = vector<int>(3);
    
[/code]

というようなコードで、`u`に`vector<int>(3)`を代入するのはどういう文法構造になっているのでしょうか。  
`vector<int>`の後の`(3)`がvectorクラス初期化時の要素の数を表しているのは理解していますが、`vector<int>(3)`が何者なのかが分かりません。`vector<int>(3)`と書くと右辺値のオブジェクトを返してくれるという決まりがあるのでしょうか？その決まりはどのドキュメントに書かれていますか？  
また、

[code]

    u = *(new vector<int>(3));
    
[/code]

とはどういう違いがあるのでしょうか？


CC BY-SA 4.0
2019-07-15T08:42:40.873
56656
2019-07-15T12:35:03.990
34732
question
c++
C++ の u = vector<int>(3) のような文法について


> `vector<int>(3)`が何者なのかが分かりません。

見たままの意味です。[コンストラクター](https://ja.cppreference.com/w/cpp/container/vector/vector)呼び出しで、複数あるオーバーロードのうち、`size_type
count`に該当するため、3要素を持つ`std::vector<int>`が作られます。

> `u`に`vector<int>(3)`を代入するのはどういう文法構造になっているのでしょうか。

「代入」そのままの意味ではありません。C++言語には演算子オーバーロードがあり、`std::vector`も[operator=()](https://ja.cppreference.com/w/cpp/container/vector/operator%3D)をオーバーロードしています。  
`vector&&
other`に該当するため、右辺値`vector<int>(3)`が左辺値`u`にムーブされます。そのうえで右辺値`vector<int>(3)`は使用されなくなるためデストラクターで解放されます。

>
[code]

>     u = *(new vector<int>(3));
>  
[/code]

右辺値`*(new vector<int>(3))`が左辺値`u`にムーブされる点は同じです。しかし`new
vector<int>(3)`はポインターに過ぎないため解放されません。明示的に`delete`する必要があります。


CC BY-SA 4.0
2019-07-15T12:26:46.207
56658
2019-07-15T12:26:46.207
4236
56656
answer


解説されていないところだけ追記

> `vector<int>(3)` と書くと右辺値のオブジェクトを返してくれるという決まりがあるのでしょうか？

はい

> どのドキュメントに書かれていますか？

公式ドキュメントとなると ISO/IEC 14882 C++ 言語仕様書となるでしょう。オイラの手元にはすごく古い ISO/IEC 14882:1998
とその翻訳である JIS X 3014:2003 しかありませんが、これから引用。

> 3.10 左辺値と右辺値 の 6  
>  6 非参照型へのキャストの結果によって生じる一時的オブジェクトをもつ式は、右辺値とする（これには関数記法を使ったオブジェクトの明示的生成の場合を含む）


CC BY-SA 4.0
2019-07-15T12:35:03.990
56659
2019-07-15T12:35:03.990
8589
56656
answer