С выпущенным GCC 4.8.0 у нас есть компилятор, который поддерживает автоматическое определение типа возвращаемого значения, часть C ++ 14. С помощью -std=c++1y
я могу сделать это:
auto foo() { //deduced to be int
return 5;
}
Мой вопрос: когда мне следует использовать эту функцию? Когда это необходимо и когда это делает код более чистым?
Сценарий 1
Первый сценарий, который я могу придумать, всегда возможен. Каждая функция, которую можно написать таким образом, должна быть. Проблема в том, что это не всегда может сделать код более читабельным.
Сценарий 2
Следующий сценарий - избегать более сложных возвращаемых типов. В качестве очень легкого примера:
template<typename T, typename U>
auto add(T t, U u) { //almost deduced as decltype(t + u): decltype(auto) would
return t + u;
}
Я не верю, что это когда-либо будет проблемой, хотя полагаю, что наличие явной зависимости типа возвращаемого значения от параметров в некоторых случаях может быть более ясным.
Сценарий 3
Затем, чтобы предотвратить избыточность:
auto foo() {
std::vector<std::map<std::pair<int, double>, int>> ret;
//fill ret in with stuff
return ret;
}
В C ++ 11 мы иногда можем просто return {5, 6, 7};
вместо вектора, но это не всегда работает, и нам нужно указать тип как в заголовке функции, так и в теле функции. Это чисто избыточно, и автоматический вывод типа возвращаемого значения избавляет нас от этой избыточности.
Сценарий 4
Наконец, его можно использовать вместо очень простых функций:
auto position() {
return pos_;
}
auto area() {
return length_ * width_;
}
Однако иногда мы можем смотреть на функцию, желая узнать точный тип, и, если он там не указан, нам нужно перейти к другой точке кода, например, где pos_
объявлено.
Вывод
С учетом этих сценариев, в каких из них на самом деле окажется ситуация, когда эта функция будет полезна для очистки кода? А как насчет сценариев, которые я здесь не упомянул? Какие меры предосторожности следует предпринять перед использованием этой функции, чтобы она меня не укусила позже? Есть ли что-то новое в этой функции, что невозможно без нее?
Обратите внимание, что несколько вопросов предназначены для помощи в поиске точек зрения, с которых можно на них ответить.