Когда мне следует использовать автоматическое вычитание типа возврата C ++ 14?

С выпуском 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_.

Заключение

С учетом изложенных сценариев, какие из них на самом деле оказываются в ситуации, когда эта функция полезна для повышения чистоты кода? Как насчет сценариев, о которых я не упомянул? Какие меры предосторожности следует предпринять, прежде чем использовать эту функцию, чтобы она не укусила меня позже? Есть ли что-то новое, что эта функция приносит в таблицу, что невозможно без нее?

Обратите внимание, что несколько вопросов призваны помочь в поиске перспектив, на которые можно ответить. [тысяча сто двадцать два]

137
задан Deduplicator 3 January 2016 в 03:17
поделиться