c++11 const参照の受け方について
Posted: 2017年9月07日(木) 01:29
c++でわからないことがあるので質問させてください。
ある関数があって、例えば
class Bar {
const std::vector<std::shared_ptr<hoge>& fuga();
}
のようなconst参照を返す関数があったとします。
このとき、この受け方なのですが、
実際にはRVOなどを考えるとそもそもconst参照で返す必要がないのかもしれないのですが、
(これについてもご意見を伺いたいです。)
もしこのような関数があったとき、受ける側は、
auto fuga = bar.fuga();
で受けるのか、
const auto& fuga = bar.fuga();
で受けるのとではどちらが良いでしょうか?
また、前者の場合は、fuga()がcons参照で返しているので、
そもそもauto fuga = bar.fuga();で受けた場合もconst auto fuga& = bat.fuga()
で受けた場合もまったく同じになりますでしょうか?
前者で受けた場合もconst参照になるのかが知りたいです。
また、c++では関数の返り値がconst参照でなかった場合
つまり
class Bar {
std::vector<std::shared_ptr<hoge>> fuga();
}
だった場合でも、
受ける側がconst auto& fuga = bar.fuga();だった場合はfuga()はコピーではなくてconst参照で返すのでしょうか?
(こちらもRVOを考えるとそもそもコピーは作られないのかもしれないですが、最適化は無効にしているとしたらどうなるでしょう)
以上の3点が知りたいです。よろしくお願いします。
ある関数があって、例えば
class Bar {
const std::vector<std::shared_ptr<hoge>& fuga();
}
のようなconst参照を返す関数があったとします。
このとき、この受け方なのですが、
実際にはRVOなどを考えるとそもそもconst参照で返す必要がないのかもしれないのですが、
(これについてもご意見を伺いたいです。)
もしこのような関数があったとき、受ける側は、
auto fuga = bar.fuga();
で受けるのか、
const auto& fuga = bar.fuga();
で受けるのとではどちらが良いでしょうか?
また、前者の場合は、fuga()がcons参照で返しているので、
そもそもauto fuga = bar.fuga();で受けた場合もconst auto fuga& = bat.fuga()
で受けた場合もまったく同じになりますでしょうか?
前者で受けた場合もconst参照になるのかが知りたいです。
また、c++では関数の返り値がconst参照でなかった場合
つまり
class Bar {
std::vector<std::shared_ptr<hoge>> fuga();
}
だった場合でも、
受ける側がconst auto& fuga = bar.fuga();だった場合はfuga()はコピーではなくてconst参照で返すのでしょうか?
(こちらもRVOを考えるとそもそもコピーは作られないのかもしれないですが、最適化は無効にしているとしたらどうなるでしょう)
以上の3点が知りたいです。よろしくお願いします。