2016-10-29 16 views
0

私は、コレクションの要素の中で(特定の条件を使用して)ペアを見つけるコードを作成しています。私は本当にコレクションの要素を複製したくないので、私はポインタのペアを使用すると思った。ただし、元のコレクションの値を変更できる場合、これは安全ではありません。const値へのconst参照のバインドのみ

私のコードでは、本当に定数値にしか束縛されないconst参照を使用したいと思います。なぜなら、私はユーザーに対を悪用させたくないからです。しかしながら、このアプローチは:

using PairCollectionType = 
    std::vector<std::pair<std::shared_ptr<Cluster>, std::shared_ptr<Cluster>>>; 

PairCollectionType getClusterPairCollection(
    const std::vector<Cluster> const& clusterCollection) 
{ 
    // ... 
} 

-> "重複 'const'のエラーをもたらします。私はこれがポインターで可能であることを知っています:

const ptr_type* const ptrThatBindsOnlyToConsts; 

これはどういうわけか参照でも可能ですか?

+0

リファレンスはデフォルトでは 'const'です。いったん何かに "参照"すれば、完了します。常に同じオブジェクトを参照します。 'ref = new_object;'と書くと、参照は変更されず、 'new_object'で参照されるオブジェクトに割り当てられます。 – vsoftco

+0

'const std :: vector const&clusterCollection'に'& 'の左に2つの' const'があります。あなたは1つだけ許可されています。 – NathanOliver

+0

'ptrThatBindsOnlyToConsts'は非constオブジェクトを指すことができます。例えば。 'int x = 5; const int * const y =&x; '。 2番目の 'const'は、ポイントするように初期化されているもの以外の何かを指すように設定できないことを意味します。 –

答えて

3

これを行う必要がある理由についてはわかりません。しかし、呼び出し側がconst以外の引数を渡して、それらのケースをキャッチするためにオーバーロードを追加すると、コンパイルエラーを出すことができます:

void func(U const &) 
{ 
    // the real code 
} 

void func(U &) = delete; 
void func(U&&) = delete; 

int main() 
{ 
    U u; 
    U const cu {}; 

    func(cu); // OK 
    func(u);  // error 
    func(U{}); // error 
} 
+0

うわー、私はこれを知らなかった、ありがとう! :) –

関連する問題