Различение передачи по ссылке и передачи по значению - PullRequest
2 голосов
/ 18 мая 2011

Как функции передачи по ссылке обычно отличаются от функций передачи по значению? Например:

template <typename T>
void sort(std::vector<T>& source); // Sorts source.

// Versus...

template <typename T>
std::vector<T> sort(std::vector<T> source); // Returns a sorted copy of source.

Эти две функции неоднозначны; один из них должен быть переименован или полностью удален.

Как можно избежать этой ситуации? Должна ли одна форма быть предпочтительнее другой? Или есть какие-то общие правила именования, чтобы отличать их?

Ответы [ 3 ]

6 голосов
/ 18 мая 2011

Разве вы не можете просто дать им разные имена? Я бы назвал, например, функциональную версию sorted.

То, что вы можете перегружать функции (или шаблоны функций в этом случае), не означает, что у вас есть до.

Кстати, вы можете реализовать «функциональную версию» в терминах «императивной версии»:

template <typename T>
void sort(std::vector<T>& source)
{
    // sort in place
}

template <typename T>
std::vector<T> sorted(std::vector<T> copy)
{
    sort(copy);
    return copy;
}
2 голосов
/ 18 мая 2011

FredOverflow ударил гвоздь по голове. Тем не менее, чтобы ответить на ваш вопрос "Или есть какие-то общие правила именования, чтобы отличать их?" Просто убедитесь, что вы последовательны. Например, что-то вроде SortCopy для второго имени функции в вашем примере. Неважно, если это SortCopy, SortCpy, Sort_Copy ... важно то, что во всем коде вы последовательны (например, все функции, действующие на копию, имеют префикс «Копировать», а не тот, что имеет «Копировать», следующий Cpy и т.д ...).

0 голосов
/ 18 мая 2011

Обычно предпочитают не проходить по неконстантной ссылке, если это возможно, и использовать вторую форму.Это потому, что, во-первых, вторая сортировка играет намного лучше, если вы хотите передать возвращаемое значение другой функции, а во-вторых, потому что оптимизатор компилятора в большинстве случаев будет иметь дело с ненужным копированием, и, в-третьих, потому что наличие ссылки предотвращает любой видTMP обнаруживает тот факт, что это действительно возвращаемое значение, и предотвращает использование функции в любом контексте контекста объекта функции.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...