質問: new std::vector(); delete pvec; ```
回答: > > 私は場合分けを減らすためにしばしば引数にコンストラクタを渡します. > > > コンストラクタを渡してはいません。 呼び出し側でコンストラクタによって初期化された一時オブジェクトを 呼び出された func の vec が共用してアクセスします。 呼び出し側でコンストラクタによって初期化された一時オブジェクトを使い、 コピーコンストラクタで func の仮引数 vec を初期化するということでは ありません。 func の vec を呼び出し側のコンストラクタで初期化すると解釈しても構いません。 > > 引数にコンストラクタのインスタンスを渡している例や説明をあまりにも見かけないので心配になり質問しました. > > > の sort を使って vector を降順にソートするとき、 sort(vec.begin(), vec.end(), greater()); と書きます。 greater() は、greaterクラスのインスタンスで、このクラスには、 bool operator()(int a, int b) { return a > b; } いうメンバ関数が定義されてるので、 greater() は関数オブジェクトと呼ばれます。 ``` vector vec; func(vec); ``` この場合、呼び出し側の vec の値を使い、コピーコンストラクタで func の vec を初期化します。 値渡しです。変数渡しではありません。 void func(vector& vec) { と宣言されていれば、 参照渡しであり、これを変数渡しといっても構いません。 vector vec; で宣言された vec は左辺値です。 vector() で生成された一時オブジェクトですら左辺値です。 だから、次のプログラムはエラーになりません。 ``` #include int main() { std::vector() = { 1, 2, 3 }; } ```