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