2017-05-04 20 views
-3

私は、関数の引数としてunique_pointer参照が渡されたという状況に直面しました。だから私はそれを見て、コードが実際にコンパイルして実行していることを知った。C++ 11/14ユニークなポインタではないユニークなポインタですか?

なぜ可能ですか? そのポインタの参照を持つことができるとき、ポインタはどのようにユニークですか?

ここに私の例:

class Foo{ 
    public: 
    int bar{23}; 
}; 

void Bar(std::unique_ptr<Foo>& a_foo){ 
    a_foo->bar = 42; 
} 

int main(int argc, char *argv[]){ 

    auto foo{ std::make_unique<Foo>() }; 
    Bar(foo); 
    std::cout << foo->bar << std::endl; //outputs 42 

    return 0; 
} 
+3

"一意"は "一意の所有権"を意味します。 –

+0

Do。あなたはgetメソッドを知っていますか? –

答えて

5

方法は、あなたがそのポインタの参照を持つことができるポインタユニークなのですか?

あなたは好きなだけそのポインタを参照することができますが、実際には1つだけです。

&を削除して、unique_ptrをコピーしようとすると、プログラムがビルドされません。同じものを指すポインタが複数あるように、ポインタを複製/コピーすることはできません。それが「ユニークな」という意味です。

+0

まだそれに満足していません.. –

+5

@ C.Michael:満足感がないことについて私ができることは何もありません。 –

3

参照は、ポインタの新しいインスタンスを作成しません。あなたがポインタを参照できるという理由だけで、それが一意ではありません。私は名前であなたを参照することができます、それはあなたの名前を使用するたびにあなたをクローンしてきたわけではありません:) C++のリファレンスは - この点で - 人の名前のようです。

+1

いいアナロジー! –

+0

応答してくれてありがとう、私が答えたいと思っていたこと、そしてフレーズが正しくなかったことは、ユニークなユニークなポインタの背後にある考えではないのですか?他の場所でそれを参照することができれば、それを変更することはできますが、なぜ共有を使用しないのですか? –

+2

@ C.Michael参照を使用するときは、リファレンスがダングリングリファレンスにならないようにすることはあなた次第です。言い換えれば、コンパイラはあなたのソフトウェアを間違って設計することを妨げることはできません。共有ポインタが必要な場合は、コンパイラがあなたに強制することを期待しているわけではなく、それが正しいことだからです。 –

関連する問題