私には、すべてを「const」値として返す習慣(?!?!?)があります。このような...
struct s;
s const make_s();
s const &s0 = make_s();
s const s1 = make_s();
移動操作とr値参照および次の関数を使用して...
void take_s(s &&s0);
void take_s(s const &&s0); // Doesn't make sense
もう書けない…
take_s(make_s());
const値を返す規則を使い始めた主な理由は、誰かがこのようなコードを記述できないようにするためです...
make_s().mutating_member_function();
ユースケースは次のとおりです...
struct c_str_proxy {
std::string m_s;
c_str_proxy(std::string &&s) : m_s(std::move(s)) {
}
};
c_str_proxy c_str(std::string &&s) {
return c_str_proxy(s);
}
char const * const c_str(std::string const &s) {
return s.c_str();
}
std::vector < std::string > const &v = make_v();
std::puts(c_str(boost::join(v, ", ")));
std::string const my_join(std::vector < std::string > const &v, char const *sep);
// THE FOLLOWING WORKS, BUT I THINK THAT IS ACCIDENTAL
// IT CALLS
//
// c_str(std::string const &);
//
// BUT I THINK THE TEMPORARY RETURNED BY
//
// my_join(v, "; ")
//
// IS NO LONGER ALIVE BY THE TIME WE ARE INSIDE
//
// std::puts
//
// AS WE ARE TAKING THE "c_str()" OF A TEMPORARY "std::string"
//
std::puts(c_str(my_join(v, "; ")));
この特定のユースケースでは、「const値を返す」とr値の参照が混在していないように見えます。そうですか?
**Edit 0: Extra question...**
オブジェクトはとにかく一時的です。なぜ「const」は移動を防ぐ必要があるのですか?なぜ「一定の」一時的なものを移動できないのですか?