У меня есть привычка (?!?!?) возвращать все как "константное" значение. Так...
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());
Основная причина, по которой я начал использовать соглашение о возврате константных значений, заключается в том, чтобы не дать кому-то написать такой код...
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, "; ")));
Похоже, что «возвращаемое константное значение» и ссылки на r-значение не смешиваются в этом конкретном случае использования. Это правильно?
**Edit 0: Extra question...**
В любом случае объект временный. Почему "const" должен препятствовать движению? Почему мы не можем перемещать "константные" временные файлы?
const T operator++(int)
в качестве подписи для postfix++. - person Adam Burry   schedule 13.09.2013