次のコード行:
bootrec_reset(File(path, size, off), blksize);
プロトタイプを使用した関数の呼び出し:
static void bootrec_reset(File &file, ssize_t blksize);
このエラーが表示されます:
libcpfs / mkfs.cc:99:53:エラー:タイプ「File」の右辺値からのタイプ「File&」の非定数参照の無効な初期化
libcpfs / mkfs.cc:30:13:エラー:「voidbootrec_reset(File&、ssize_t)」の引数1を渡す際に
const &
標準に従って、非定数参照()を右辺値に渡すことはできないことを認識しています。ただし、MSVCではこれを行うことができます(この質問を参照)。この質問は理由を説明しようとしますが、彼はリテラルへの参照を使用しているため、答えは意味がありません。リテラルへの参照は、コーナーケースであり、明らかに許可されるべきではありません。
与えられた例では、次の順序のイベントが発生することは明らかです(MSVCの場合と同様)。
File
のコンストラクタが呼び出されます。File
、、およびへの参照がblksize
スタックにプッシュされます。bootrec_reset
を利用しfile
ます。- から戻った後
bootrec_reset
、一時的なFile
ものは破棄されます。
File
非constメソッドが呼び出されるファイルへの一時的なハンドルであるため、参照は非constである必要があることを指摘する必要があります。File
さらに、そこに構築されるコンストラクター引数を渡したくありません。また、呼び出し元でオブジェクトbootrec_reset
を手動で構築して破棄する理由もわかりません。File
だから私の質問は:
- この方法で非定数参照を許可しないC++標準を正当化するものは何ですか?
- GCCにこのコードを許可させるにはどうすればよいですか?
- 今後のC++0x標準はとにかくこれを変更しますか、それとも新しい標準が私に与える何か、ここでより適切なものがありますか?