Я почти уверен, что это потому, что это может привести к хаосу с ссылками на rvalue и любым видом decltype
.Хотя эти функции отсутствовали в C ++ 03, известно, что они появятся.
Что еще более важно, я не верю, что любая стандартная функция возвращает константные значения, это, вероятно, то, что не рассматривалосьдо тех пор, пока стандарт не был опубликован.Кроме того, постоянные значения, как правило, не считаются правильным решением ™.Не все случаи использования неконстантных функций-членов недопустимы, и возвращение константных значений полностью предотвращает их.
Например,
auto it = ++vec.begin();
является совершенно допустимой и, действительно, допустимой семантикой, еслине совсем желательно.Рассмотрим мой класс, который предлагает цепочки методов.
class ILikeMethodChains {
public:
int i;
ILikeMethodChains& SetSomeInt(int param) {
i = param;
return *this;
}
};
ILikeMethodChains func() { ... }
ILikeMethodChains var = func().SetSomeInt(1);
Следует ли это запретить только потому, что, может быть, иногда мы можем вызвать функцию, которая не имеет смысла?Нет, конечно нет.Или как насчет «swaptimization»?
std::string func() { return "Hello World!"; }
std::string s;
func().swap(s);
Это было бы недопустимо, если бы func()
произвел выражение const - но это совершенно правильно и действительно, предполагая, что реализация std::string
не выделяет никакой памяти вконструктор по умолчанию, быстрый и разборчивый / читабельный.
Следует понимать, что правила C ++ 03 rvalue / lvalue, честно говоря, просто не имеют смысла.Они, фактически, только частично испечены, и минимум, необходимый, чтобы запретить некоторые вопиющие ошибки, допуская некоторые возможные права.Правила C ++ 0x rvalue намного разумнее и намного более совершенные complete .