C++ の u = vector<int>(3) のような文法について


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]

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




> `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`する必要があります。

