2016-12-22 8 views
3

const参照は参照しているオブジェクトを変更できないことを確認します。たとえば、次のようにポインタへのconst参照はオブジェクトを変更することができます

int i = 1; 
const int& ref = i; 
ref = 42; // error, because of a const reference 

しかし、あなたはポインタまたはunique_ptrへの参照を使用する場合、次のことができます。例:

class TinyClass { 
public: 
    int var = 1; 
    void f1() { var = 42; } 
}; 

std::unique_ptr<TinyClass> pointer(new TinyClass); 
const std::unique_ptr<TinyClass>& constRef = pointer; 
constRef->f1(); // no error 

ポインタ自体が変更されていないと考えられます。しかし、これはmisleading、または易しい間違いのように感じます。ポインタへの "実" const参照を宣言する簡単な方法はありますか? in:オブジェクト自体がconstであることを確認します。

編集:私はunique_ptrのタイプを変更できないと仮定します。実際のシナリオでは、いくつかのオブジェクトがvector<unique_ptr<C>>で構築され、一部の関数がその要素の1つに対する(const)参照を取得することがあります。

+4

'std :: unique_ptr 'を使ってください。 – Petr

+0

さらに悪いことに、constオブジェクトの参照されるメンバ変数を変更することができます。 – stefaanv

+0

最初のスニペットも非常に疑わしく見えます。私に何かを割り当ててみてください。 –

答えて

3

constconst std::unique_ptr<TinyClass>& constRefは、constRefがセットアップ後に別のオブジェクトを指し示さないことを保証します。オブジェクト自体とは何の関係もありません。

あなたがオブジェクト自体を変えないようにしたい場合:

std::unique_ptr<const TinyClass> ptr_to_const_object; 

編集(OPの編集後):

あなたは何もすることはできません。 const vector<unique_ptr<C>>&が必要な機能があるため、関数はポインタ内のオブジェクト(ポインタも)と一緒に再生する必要があることを明確に示しますが、ベクトル項目を変更する必要はありません(新しい項目の追加や削除など) 。

+0

それは簡単な方法でしょう。しかし、私の実際の使用例では、オブジェクトはunique_ptrsのベクトルにあります。私はそれを変えることはできません。関数は、これらのオブジェクトの1つへの(const)参照を受け取ります。それはconstが意味するものではないことがわかったところです – Basti

+0

あなたの質問を実際のケースで編集することができます。 –

+0

@bast私の答えを編集 –

関連する問題