5年前コマンドライン引数に入力ファイル名が与えられたかによって、入力ストリームをcinとifstreamで切り替えたいと思っています。cin;}しかし次のように書くとコンパイルが通ります。5年前std::cinはifstreamを継承していないため、ifstream&をstd::cinで初期化することはできません。ios::in)は右辺値なので左辺値参照を初期化することもできません。参照を利用したいのであれば以下のようになると思います。難しい内容ですがh2so5さんに少し補足をします。referenceが束縛できるのはlvalueのみです。故に初期化式はlvalueでなければなりません。referenceの場合は、初期化式の束縛したオブジェクトの寿命が延長されます。referenceはlvalueもprvalueもxvalueも束縛できます。5年前doitの引数はistreamの参照になっているのでistreamであるcinが正しく渡せてコンパイルできます。categoryを一致させる必要があるようです。規格の該当部分がちょっとわからないので正しい引用ができないのですが、直感的で妥当な仕様であると思います。故にisはifstreamではなくistreamの参照にし、ifstreamをlvalueにすることでコンパイルできるはずです。cin;ifstreamをrvalueにするなら、cinの方もrvalueにしなくてはならず、以下のようになります。std::move(cin);ただし、std::cinをムーブする時点で殆どの場合は不正な動作である可能性が高いので、おすすめしません。5年前nullptrさんそのコードだとargcをチェックする前にargv[1]にアクセスしてしまいます。nullptrさんそのコードだとargcをチェックする前にargv[1]にアクセスしてしまいます。5年前ifstreamとcinの変換ができないことを見落としていました。無理に参照にする必要も無さそうですね...皆様有難うございます。ifstreamとcinの変換ができないことを見落としていました。無理に参照にする必要も無さそうですね...無理なく参照にできますよ。ミクプラは自由にリンクできます。