В большинстве случаев, я бы сказал, # 4:
- Возврат код состояния, указывающий, удалась ли операция или неудачи и возвращает индекс по ссылке (либо с помощью ссылки или указателя в зависимости от версии C).
Преимущества # 4 над # 3 являются:
Когда вам нужна функция, чтобы вернуть более одного значения, просто добавьте больше эталонные параметры для значений, которые необходимо вернуть.
Если ваши функции C всегда возвращают коды состояния повсюду в вашей программе, вы всегда знаете, что код возврата является статусом.
Он не питается в вашем пространстве значений для индекса возврата (или других типов данных), возвращаемого вашей функцией, и избегает констант числа магов. (Например, если вы возвращали значение температуры по Цельсию, 0 и -1 оба действительны, как и любые положительные числа. Вы можете вернуть -274 как недопустимый, но это немного тупой.)
Возврат код может дать повод для неудачи или успеха больше, чем просто логический успех или неудача довольно простым способом.
Ото, если вы программа очень мала, и вы не возражаете, несколько магических констант, то либо # 1 или # 2 морально эквивалентны и могут сделать меньше, чем набрав # 3 или # 4. # 2 имеет несколько преимуществ по сравнению с # 1:
Как уже упоминалось в других ответах, подписанная INT возвращаемое значение может представлять только половину чисел без знака INT может представлять.
Он избегает проблем с сопоставлением с сопоставлением без знака, если вы сравниваете с sizeof (array), std :: vector :: string, которые являются size_t. Чаще всего проблема заключается в том, что предупреждение о компиляторе игнорируется (что приводит к тому, что люди обычно игнорируют предупреждения, когда они этого не делают), или кто-то исправляет это с помощью броска, надеюсь, после анализа, чтобы убедиться, что актер действительно действителен.
Я лично использовал # 1, # 2 и # 4 и нашел шкалы # 4 лучшим. Я предпочитаю по умолчанию использовать # 4, особенно в коде, где сбои распространены и их нужно обрабатывать. Либо 1, либо 2 обычно лучше всего работают, если код меньше, и вы вызываете множество подпрограмм, которые возвращают одну вещь и не могут потерпеть неудачу (например, процедуры обработки изображений).
идеальный вариант использования для [boost :: optional] (http://www.boost.org/doc/libs/1_54_0/libs/optional/doc/html/index.html) imho (ps: Я довольно уверен, что в C++ 14 будет 'std :: optional', поэтому этот подход является« будущим доказательством »). – Borgleader
Только # 1 не является необычным из 3-х опций, и поскольку массив никогда не может иметь индекс отрицательного массива в c или C++, кажется, нет причин не использовать его. – goji
Я не думаю, что это должно быть закрыто для того, чтобы быть основанным на мнениях, потому что вопрос: «Есть ли какой-либо консенсус (...) или есть 4-й вариант?». –