170 похожих чатов

Народ, а почему можно указать auto-параметр у рекурсивной функции int

func(auto n){
return n * func(n - 1);
};
а вот указать возвращаемый тип как auto нельзя?
auto func(int n){
return n * func(n - 1);
};

21 ответов

1 просмотр

А какой бы вы тип тут ожидали?)

Тут бесконечная рекурсия, никакой анализатор не угадает. Умножение int на любой тип может результировать в самые разные типы даже для дефолтных типов, не говоря о переопределенных operator*(int)

Богдан- Автор вопроса
Sergey Skvortsov
А какой бы вы тип тут ожидали?)

int, какой же еще ? В вывод типов здесь и правда усложняется но я думаю что можно в процессе вывода увидеть и заскипать который мы сейчас пытаемся вывести и выводить из остальной части выражения. Возможно в более сложных кейсах компилятору придется решать уравнение ReturnType = ReturnType * int через некий набор базовых уравнений (что операция умножения над типом int * приводит к типу int)

Богдан
int, какой же еще ? В вывод типов здесь и правда у...

> что операция умножения над типом int * приводит к типу int Это если и слева, и справа инты, а в жизни все сложнее Почему не double, например?

Богдан
int, какой же еще ? В вывод типов здесь и правда у...

C++ же и так очень быстро компилируется :)

Богдан- Автор вопроса
Sergey Skvortsov
> что операция умножения над типом int * приводит ...

потому что для переменной a и b которые имеют тип int в строчке "auto c = a * b" тип переменной "с" выводится как int

Богдан
потому что для переменной a и b которые имеют тип ...

А для переменных a: int и b: double в строчке "auto c = a * b" тип переменной "с" выводится как double

Sergey Skvortsov
А для переменных a: int и b: double в строчке "aut...

а для переменной a: int, а b: MyWrapper вообще чёрти что может вывестись

Богдан
int, какой же еще ? В вывод типов здесь и правда у...

Псевдоуравнение ReturnType = ReturnType * int имеет бесконечное множество решение, среди которых есть и int, и double, о чём вообще дальнейший разговор?

Богдан- Автор вопроса
Alexander Karaev
Псевдоуравнение ReturnType = ReturnType * int имее...

Если запретить конверсию (из int в double и в кастомные типы) для текущего еще неизвестного выводимого типа то тогда бесконечного множества решений не будет и вывод типа будет однозначен. Может в каких-то сложных и редких кейсах вывести не получится но в целом вывод возвращаемого типа рекурсивной функци возможен и Flow тому доказательство

Богдан
Если запретить конверсию (из int в double и в каст...

Так и запишем в стандарте "будем выводить типы автоматически, решая уравнения, но иногда и с тысячей запретов"

Богдан
Если запретить конверсию (из int в double и в каст...

Интересно, где в стандарте Flow написаны правила вывода типов в такой ситуации

Богдан
Если запретить конверсию (из int в double и в каст...

Вообще, немного странно сравнивать ноунейм фреймворк и стандарт С++. Напихать фич любой дурак может, а поддерживать эти фичи и согласовывать с огромным наследием языка кто будет?

Если я правильно помню в не бесконечной рекурсии вывод будет работать, если выход будет первым обрабатываться, а бесконечная рекурсия без сайд эффектов это все равно ub.

Богдан- Автор вопроса
magras
Если я правильно помню в не бесконечной рекурсии в...

точно, спасибо, теперь если добавить условие то вывод типа работает auto func(auto n){ if(n < 1) return 1; return n * func(n - 1); }; int main(int num) { std::cout << func(11); }

Богдан
точно, спасибо, теперь если добавить условие то вы...

Он не выводит тип. Он просто берет его из return 1; попробуйте переставить местами эти условия - будет CE

Богдан- Автор вопроса
다니엘(줄리아)
Он не выводит тип. Он просто берет его из return 1...

ну в целом этого достаточно для большинства кейсов, можно пока не тащить вывод типа через решение системы уравнений)

Богдан
ну в целом этого достаточно для большинства кейсов...

таким же макаром можно тогда и вручную тип указать :D

Богдан
потому что для переменной a и b которые имеют тип ...

Только ваш пример с рекурсией эквивалентен не этому, а другому примеру: auto c = c * b; И соответственно, из c и b мы никак не можем вывести c даже с точки зрения здравого смысла. Этот код абсурден

Похожие вопросы

Обсуждают сегодня

У меня такой вопрос. Вот мне нужно сделать бинарный файл с ассемблер кода: [bits 32] [org 0x7c00] start: cli mov esp, stack_space call _main hlt section .tex...
Dmytro Parkhomenko
26
@FAssembler не знаешь, fasm поддерживает thumb?
Александр Белокопытов
46
Вот сравним знания, которые требуются, чтобы знать все эти условности С компилятора, и знания, которые требуются чтобы писать программы на ассемблере. Что проще?
КТ315
23
Ребят нубский вопрос, но я в поиске чата не нашел ничего об этом. Установил я clang, Code-Blocks ( который с wingw). Пытаюсь запустить свой хелловорлд, а мне пишет fatal error...
Дима Копышов
15
model small .stack 256 .data arr db 16 dup(?) mes db 10, 13, "Enter 16 numbers: $" mes1 db " $" mes2 db 10, 13, "Sorted: $" mes3 db 10, 13, "$" i db 0 .code ...
Ыиу
42
Фуух, победила раскраску. Ну почти) Кому что посчитать? )))
Катерина Свиридова
16
При чем здесь DLL?
Marek Kotovsky
40
Снова этот оффтоп про С... В чате С не говорят столько про ассемблер, сколько в чате по ассемблеру говорят про С. Не стыдно?
КТ315
45
Приведу пару примеров напоследок: 1. Упомянутая выше сериализация. Сериализуемость можно было бы выразить, как интерфейс с методом типа "string ToJson()", да вот незадача - в ...
Danieλ Sλapman
4
может кто помочь с насм в линуксе? asm section .data numbers db 5, 2, 8, 1, 6, 3, 9, 4, 7 len equ $ - numbers format db "Max number: %d", 0xA, 0 section .text ...
Mark
3
Карта сайта