Size: a a a

2020 December 20

D

Danya in pro.cxx
По-крайней мере у меня такой вопрос
источник

D

Danya in pro.cxx
Danya
Ну я думаю вопрос в том, почему, если он не в else,  он влияет на вывод типа?
Это же по сути два разных пути выполнения
Или компилятору и так тяжко разбирать это мешанину из шаблонов и они решили сделать так?
источник

AT

Alexander Tulikov in pro.cxx
Danya
Ну я думаю вопрос в том, почему, если он не в else,  он влияет на вывод типа?
Ну а как ещё должен работать автоматический вывод типа возвращаемого значения?
источник

LA

Liber Azerate in pro.cxx
Danya
Ну я думаю вопрос в том, почему, если он не в else,  он влияет на вывод типа?
Потому что if conxtexpr выбирает только одну ветвь в компильтайме и остальные выбрасываются, соответственно возвращаемый тип известен
источник

D

Danya in pro.cxx
Alexander Tulikov
Ну а как ещё должен работать автоматический вывод типа возвращаемого значения?
Ну пройтись по конкретному пути и вывести тип
По сути алгоритм схож с тем, что не во всех ветках есть return
источник

D

Danya in pro.cxx
Liber Azerate
Потому что if conxtexpr выбирает только одну ветвь в компильтайме и остальные выбрасываются, соответственно возвращаемый тип известен
Ещё раз
Почему он не может отбросить не ветку if constexpr, если в if constexpr есть однозначный return?
источник

I

Ioann_V in pro.cxx
А это вопрос разве для этого чата?
источник

D

Danya in pro.cxx
Ioann_V
А это вопрос разве для этого чата?
А для какого?
источник

LA

Liber Azerate in pro.cxx
Danya
Ещё раз
Почему он не может отбросить не ветку if constexpr, если в if constexpr есть однозначный return?
Это докапывание до реализации, как по мне, но думаю, что именно потому что ветка выбирается на этапе компиляции и после этого, по факту, остаётся две return-инструкции и тут уже компилятор не знает ничего о предыдущем этапе "отбрасывания". Но это бессмысленные догадки. Посмотреть в стандарте надо
источник

D

Danya in pro.cxx
Liber Azerate
Это докапывание до реализации, как по мне, но думаю, что именно потому что ветка выбирается на этапе компиляции и после этого, по факту, остаётся две return-инструкции и тут уже компилятор не знает ничего о предыдущем этапе "отбрасывания". Но это бессмысленные догадки. Посмотреть в стандарте надо
Да нет
Вопрос в том, что
У нас в if constexpr однозначно по всем путям есть return
Почему ему надо смотреть куда-то ещё, кроме как эту самую ветку?

if constexpr (1)
 if (1)
  return 1;
 else
   return 0;

return std::string{};
Вот почему нельзя посмотреть просто на if constexpr, увидеть что из него мы никуда не выходим и просто отбросить другие части функции?
источник

LA

Liber Azerate in pro.cxx
Danya
Да нет
Вопрос в том, что
У нас в if constexpr однозначно по всем путям есть return
Почему ему надо смотреть куда-то ещё, кроме как эту самую ветку?

if constexpr (1)
 if (1)
  return 1;
 else
   return 0;

return std::string{};
Вот почему нельзя посмотреть просто на if constexpr, увидеть что из него мы никуда не выходим и просто отбросить другие части функции?
Потому что if constexpr просто выбор нужного блока инструкций на этапе компиляции, после чего у нас остаётся обычная функция. Там ведь не обязан быть return-statement. Вероятно, так сделать можно было бы, но не сделано, поэтому вопрос именно к реализации. Ну или стандарту. Можешь написать пропозал
источник

NK

Nikolay Kononov in pro.cxx
Danya
Да нет
Вопрос в том, что
У нас в if constexpr однозначно по всем путям есть return
Почему ему надо смотреть куда-то ещё, кроме как эту самую ветку?

if constexpr (1)
 if (1)
  return 1;
 else
   return 0;

return std::string{};
Вот почему нельзя посмотреть просто на if constexpr, увидеть что из него мы никуда не выходим и просто отбросить другие части функции?
вообще, такой код:
decltype(auto) foo() {
   return 1;
   return "kek";
}
int main() { foo(); }
тоже падает с ошибкой компиляции (с такой же как и предыдущий)
источник

D

Danya in pro.cxx
Nikolay Kononov
вообще, такой код:
decltype(auto) foo() {
   return 1;
   return "kek";
}
int main() { foo(); }
тоже падает с ошибкой компиляции (с такой же как и предыдущий)
Ну тут ещё проблема в том, что это не шаблон
источник

AF

Aidar Fattakhov in pro.cxx
Danya
Пахнет очередной багой стандарта...
ну эт не баг
источник

AT

Alexander Tulikov in pro.cxx
Danya
Ну пройтись по конкретному пути и вывести тип
По сути алгоритм схож с тем, что не во всех ветках есть return
источник

AF

Aidar Fattakhov in pro.cxx
вы хотите return заифать или че?
источник

D

Danya in pro.cxx
Ну вот опять же, почему оно не могло дискарднуться :(
источник

AF

Aidar Fattakhov in pro.cxx
этого недостаточно
источник

AF

Aidar Fattakhov in pro.cxx
там может быть любая noreturn функция и еще внутри куча ветвлений
источник

AF

Aidar Fattakhov in pro.cxx
короче выделяйте блоками и всё, просто помните что else это на самом деле constexpr else просто слово опустили, но оно важно
источник