Несколько auto в объявлении функции

132
16 января 2022, 21:20

Можно объявить функцию так, чтобы узнать возвращаемый тип по типу возвращаемого выражения:

auto foo();

Можно объявить так, чтобы написать возвращаемый тип в конце:

auto bar() -> int;

Но что означает следующий синтаксис?

auto baz() -> auto;
Answer 1

Грамматически, синтаксис auto baz() -> auto; является корректным в соответствии с https://eel.is/c++draft/dcl.decl#5 и https://eel.is/c++draft/dcl.spec.auto#3.

noptr-declarator parameters-and-qualifiers trailing-return-type

The placeholder type can appear with a function declarator in the decl-specifier-seq, type-specifier-seq, conversion-function-id, or trailing-return-type, in any context where such a declarator is valid.

Про значение написано далее в https://eel.is/c++draft/dcl.spec.auto#3:

If the function declarator includes a trailing-return-type ([dcl.fct]), that trailing-return-type specifies the declared return type of the function.

То есть возвращаемый тип определяется -> auto в нашем случае. И далее в том же пункте:

If the declared return type of the function contains a placeholder type, the return type of the function is deduced from non-discarded return statements, if any, in the body of the function.

Таким образом, разница между 1 и 3 только формальная: в первом случае declared return type будет placeholder type auto до параметров, а в третьем -- placeholder type auto после. Но, так как это один и тот же placeholder type auto, то поведение у них одинаковое, а именно: the return type of the function is deduced from non-discarded return statements, if any, in the body of the function.

Answer 2

Это комбинация 1 и 2 случаев. Эквивалентна 1 по поведению.

Answer 3

Возвращаемое значение функции будет вычислено на основе типа выражения после return. Можно почитать тут https://en.cppreference.com/w/cpp/language/auto

The auto specifier may also be used with a function declarator that is followed by a trailing return type, in which case the declared return type is that trailing return type (which may again be a placeholder type).

READ ALSO
Запуск MPI программы без mpiexec/mpirun

Запуск MPI программы без mpiexec/mpirun

Какое поведение следует ожидать при запуске MPI программы без mpiexec/mpirun, но скомпилированной с помощью MPI компилятора? Специфицировано ли оно...

48
Как удалить элемент в линейном списке?

Как удалить элемент в линейном списке?

Создал линейный список и заполнил числами от 0 до 10Как удалить элемент списка, значение которого равно 5? Пожалуйста, подскажите

79
c# - повторное использование подключенных методов

c# - повторное использование подключенных методов

Нужен способ вытаскивать инфу из msi пакетаНашел решение в инете, на его основе сделал класс

155
Task.FromException c#

Task.FromException c#

Создаю асинхронную задачу Task

126