C++の参照セマンティクスに関してちょっと混乱します。const以外のオブジェクトをconst参照から初期化するときのコピーを防止します
class foo
{
private:
std::map<int, int> stuff;
public:
const std::map<int, int>& getStuff()
{
return stuff;
}
};
そして、次のように私はそれを使用します:私はconst参照を返すクラスがあるとし
foo f;
std::map<int, int> s = f.getStuff();
:罰金ですが、私はそれを使用した場合、次のように
foo f;
const std::map<int, int>& s = f.getStuff();
正確にはどうなりますか?
私が正しく理解していれば、stuff
のconst参照が返され、コピーがs
に作成され、そこで私は大混乱を招く可能性があります。これを避ける方法はありますか?
編集:
だからここに呼ばれているコピーコンストラクタを回避するための手立てはこれがstd::map<int, int>
コピーコンストラクタを呼び出し、コピーを作成します
AFAIKコピーコンストラクタが呼び出され、これを回避する方法はありません。 – Lagerbaer
あなたはそうです。しかし、あなたがそれをやめないようにしたいのであれば、いつでも 's' constを作ることができます。また、 's'をconst refにすることは、' f'がその間に生きていることを確認する必要があることを意味します。もしそれが以前に宣言された自動変数であれば自動的に起こりますが、ヒープ上に作成されました。 –
しかし、 's'で行った変更は、元のオブジェクト' stuff'には影響しません。それであなたはどのように影響を受けますか? – Naveen