我有習慣(?!?!?)將所有東西都返回爲「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, "; ")));
看上去彷彿「返回常量的值」和R值引用並不在這個特定用例混合。是對的嗎?
**Edit 0: Extra question...**
無論如何,該對象是臨時的。爲什麼要「const」防止移動?爲什麼我們不能移動「const」臨時對象?
我真的沒有看到首先返回const值的基本原理。你爲什麼會在乎阻止人們在返回的對象上調用變異成員函數? – jalf
常量值返回習慣用法的一個例子可以在Meyers的「更有效的C++」中找到,1996,第6項。Meyers推薦'const T operator ++(int)'作爲postfix ++的簽名。 –