2010-12-28 8 views
11

コンストラクタがオブジェクトへの定数参照を受け取り、それをローカルに格納するクラスを記述する必要があります。C++:non-temporary const reference

ほとんどの一般的な間違いを避けるために、非一時的な参照(例:左辺値の参照)のみを受け入れたいと思います。

非一時的なもののみを参照する関数を作成するにはどうすればよいですか?もちろん


も、非一時的には、スコープの外に出るので、私のクラスの振る舞いを破るが、私は一時的な参照を許可しないことで、私が最も間違いを避けるためになると信じている可能性があります。

+0

なぜこのようなほとんどの間違いを避けると思いますか? –

+0

さて、リファレンスを渡す必要があるオブジェクトは、インスタンス化された後に使用する必要はありません(つまり、オブジェクトをインスタンス化して渡すので、コード・スタイルのためスタック上でインスタンス化しません)。他のクラスのコンストラクタが_permanent_値を必要とし、一時的に拒否された(つまり、コンパイルされた時間エラー)ということを覚えていることを忘れてしまったら、私は願っています。 – peoro

答えて

18

あなたが参照を格納し、コンストラクタが完了した後にそれを使用する必要があるとしている場合、それはおそらく、ポインタを取るコンストラクタのが最善です:

struct C { 
    C(const X* p) : p_(p) { } 

    const X* p_; 
}; 

このように、それはほとんどあなたが保証です(Xが何かを本当にダムしない限り、&を単数にオーバーロードしてthisを返すようなポインタを持たないでしょう)。

コンストラクタがポインタを受け取る場合、コンストラクタに渡すオブジェクトXの存続期間に注意する必要があるクラスのユーザーにも、ポインタが明確になります。

+4

清潔でスマートなソリューション! –

+1

うん、同意し、きれいでスマートな解決策!また、 'p'がnullではないと主張し、それを参照として保存します。 – peoro

+0

OPは、ポインタが優れていることを覚えておいてください!絶対に必要なときにのみ参照を使用します(コピーコンストラクタなど)。 – Yttrill

関連する問題