Я понимаю синтаксис и общую семантику указателей и ссылок, но как мне решить, когда более или менее целесообразно использовать ссылки или указатели в API?
Естественно, что в некоторых ситуациях нужен один или другой (operator++
нужен ссылочный аргумент), но в целом я нахожу, что предпочитаю использовать указатели (и константные указатели), поскольку синтаксис ясен, что переменные передаются деструктивно.
например. в следующем коде:
void add_one(int& n) { n += 1; }
void add_one(int* const n) { *n += 1; }
int main() {
int a = 0;
add_one(a); // Not clear that a may be modified
add_one(&a); // 'a' is clearly being passed destructively
}
С указателем всегда (более) очевидно, что происходит, поэтому для API и т.п., где ясность представляет большую проблему, указатели не более подходят, чем ссылки? Означает ли это, что ссылки следует использовать только при необходимости (например, operator++
)? Существуют ли какие-либо проблемы с производительностью с одним или другим?
EDIT (OUTDATED):
Помимо предоставления значений NULL и работы с необработанными массивами, кажется, выбор сводится к личным предпочтениям. Я принял нижеприведенный ответ: Руководство по стилю Google С++, поскольку они представляют представление, что "Ссылки могут вводить в заблуждение, поскольку они имеют синтаксис значений но семантика указателя.".
В связи с дополнительной работой, необходимой для дезинфекции аргументов указателя, которые не должны быть NULL (например, add_one(0)
вызовет версию указателя и сломается во время выполнения), имеет смысл с точки зрения поддерживаемости использовать ссылки, где объект ДОЛЖЕН присутствовать, хотя стыдно потерять синтаксическую ясность.