Мне нравится передавать по ссылке, если значение NULL не имеет значения, но я вижу аргументы для обоих. Если вы осторожны с кодированием, вы, вероятно, можете устранить случайное возражение, связанное с передачей по ссылке, убедившись, что вы всегда передаете переменные по константной ссылке, например:
myfunc( const_cast< const int& >( a ) );
// Alternatively, this approach may require additional handling
// in the function, but it's cleaner at call point
myfunc( boost::cref( a ) );
Это много лишнего кода для небольшой выгоды. Как указал Кенни, C # обращался к этому с противоположной стороны (требуя конкретной передачи по ссылке), но это не вариант для C ++ (если, например, вы не написали свои функции, чтобы использовать в качестве параметра обертку для ссылок, например boost :: ref (param)), например:
void myfunc( const boost::reference_wrapper< int >& a ) { ... }
Исправление проблемы с указателем является более проблематичным, хотя ... во время компиляции не существует способа убедиться, что указатель действителен, поэтому вы в конечном итоге сталкиваетесь либо с проблемами времени выполнения для проблем с указателем, либо проверками времени выполнения, либо с обоими. Это природа указателей.
Во всяком случае, это только мое мнение, для чего оно стоит.