Я думаю, что это должно быть разрешено и считается действительным на всех языках. Если у вас есть функция, тип возврата которой равен void
, и вы возвращаете результат выражения, тип которого void
(например, вызов другой функции void
), вы удовлетворены этим ограничением.
Это не считается полезным для этого в C (хотя я думаю, что это может быть разрешено), потому что нет необходимости в нем.В любое время вы делаете:
return someVoidFn();
Вы всегда можете перевести, что:
someVoidFn();
return;
И получить тот же эффект.
Однако, на C++ и Java, возврат функции void
имеет реальное использование, и это потому, что эти языки имеют шаблоны и генерические файлы. Рассмотрим это (не очень полезно) Java класс:
class NestedIdentity<T> {
T run(int i, T value) {
if (i == 0) return value;
return run(i - 1);
}
}
Его run
метод возвращает значение, которое вы пройти к нему, после того, называющая себя заданное число раз. Я знаю, бессмысленно, правда? Но важная часть состоит в том, что T
может быть недействительным. Вы можете сделать это:
NestedIdentity<Void> nest = new NestedIdentity<Void>();
nest(5, null);
И это работает. В Java Void
(обратите внимание на капитализацию) создает экземпляр общего типа с типом void
, единственным значением которого является null
. Если Java не разрешало возвращать выражение void
в методе void
, это должно было быть ошибкой времени компиляции для создания экземпляра generic с помощью void.
Это имеет смысл, но не в Java или C++, для которых возвращаемый void обозначается возвратом без аргумента. Во всяком случае, вы часто видите функцию возврата void как процедуру, то есть часть кода с побочным эффектом, а не функцию, которая вычисляет ... нет значения. –
Ну да, это все зависит от языка. Вы легко можете представить себе язык под названием Vava, который является таким же, как Java, за исключением этого. –
Имейте в виду, что оба этих языка эволюционировали из C, изначально не имевшего 'void'. Все функции были определены для возврата чего-либо ('int' по умолчанию), и вы можете назначить переменную для результата функции, которая никогда не возвращала значения, давая вам мусор. С другой стороны, в Algol/Pascal/Ada вы пишете либо 'procedure' (который не возвращает значение), либо' function' (что делает). Вы могли бы сказать, что функция 'void' является попыткой добавить' procedure' в C, чтобы предотвратить использование результатов мусора функций, которые ничего не возвращают. – ajb