@ProCxx

Страница 2379 из 2477
Constantine
25.09.2018
23:32:00
да, это верно

cheched exception, являющиеся возвращаемым значением функции

с типом "checked exception", который может быть параметром функции

PRoSToC0der
25.09.2018
23:36:08
сложности кстати будут в шаблонных функциях

Google
Constantine
25.09.2018
23:36:18
там все идеально

у меня есть реализация

PRoSToC0der
25.09.2018
23:36:27
допустим мы хотим всё перебросить

и нужно как-то получить всё что мы перебрасываем

придётся немного дублировать код

Constantine
25.09.2018
23:37:01
ну если компилер научить выводить (а он может), все ок

PRoSToC0der
25.09.2018
23:37:02
и нужно как-то получить всё что мы перебрасываем
чтобы записать это в возвращаемый тип

Constantine
25.09.2018
23:37:47
using load_data_exceptions = type_base_set<...> using decode_exceptions = type_base_set<...> using load_string_exceptions = type_base_or<load_data_exceptions, decode_exceptions>

result<std::string, load_string_exceptions> load_string

Constantine
25.09.2018
23:38:42
да, получается дублирование
это не дублирование, просто тайпдеф

в совершенном шаблоне можно выводить через declval всегда

но это типичная проблема слишком шаблонного кода

Google
PRoSToC0der
25.09.2018
23:40:02
ну допустим у нас в шаблонной функции принимаются 3 функтора и мы их все где-нибудь да вызываем в функции и получается нам нужно будет повторить все исключения этих функций в result type

exceptions_of_t<decltype(f1(args...)), decltype(f2(args2...)), decltype(f3(args3...))>

что-то в таком духе

можно в язык ввести фичу с помощью которой можно было бы создавать правила для вывода типа в случае возврата функцией разных типов

-> exception_combine_t<ReturnTypes...>

auto parse(std::string s) -> variant_combine_t<ReturnTypes...> { if (...) { return float{/*...*/}; } else if (...) { return int{/*...*/}; } else { return s; } } соответственно возвращаемый тип будет std::variant<float, int, std::string> правда нужен какой-то адекватный синтаксис

PRoSToC0der
25.09.2018
23:50:01
там можно auto
хммм, а это неплохая идея, если ты конечно про exceptions_of_t<auto>

Constantine
25.09.2018
23:51:02
-> exception_combine_t<ReturnTypes...>
если расширять синтаксис, там throws ( /*<condition> -> element или auto или typedef*/ auto, typedef exception_type )

или даже typedef throws(auto) exception_type

к сожалению, С++ не имеют воздействия на type deduction в auto

грубо говоря, auto в return не инстанцирует условный auto_common_type

Constantine
25.09.2018
23:53:07
variant_combine_t<auto> parse(std::string s) { /*...*/ }
да просто auto parse(std::string s) { /*спокойно выводим тип*/ }

PRoSToC0der
25.09.2018
23:53:29
да просто auto parse(std::string s) { /*спокойно выводим тип*/ }
но откуда компилятор узнает, что мы хотим std::variant?

Constantine
25.09.2018
23:53:37
using result_type = variant<какой-т>

PRoSToC0der
25.09.2018
23:54:03
using result_type = variant<какой-т>
ну вот, а я предлагаю для этого фичу новую

Constantine
25.09.2018
23:54:10
если речь про спецсинтаксис то я за void parse(std::string s) throws(auto)

PRoSToC0der
25.09.2018
23:54:27
если речь про спецсинтаксис то я за void parse(std::string s) throws(auto)
но я тут уже надумал не только для исключений)

Google
Constantine
25.09.2018
23:55:05
но я тут уже надумал не только для исключений)
а, если про кастомизацию auto return type deduction, там сложно

например, непонятно, как работать с рекурсией

Roman
25.09.2018
23:55:19
Чот на мой вопрос про RTTI для виртуального наследования в clang maillist за неделю никто не ответил :(

Попробуем stackoverflow https://stackoverflow.com/questions/52508052/rtti-for-virtual-inheritance-without-virtual-functions

Constantine
25.09.2018
23:56:16
видимо, в variant<auto> надо будет объяснять это variant<auto> кастомной выводилке

хотя если считать, что это монолитный оператор и поиск ведется именно variant<auto> мб сработает

PRoSToC0der
25.09.2018
23:57:02
например, непонятно, как работать с рекурсией
тут кажется её нельзя допускать вообще (я имею в виду напрямую return same_fun(...))

Constantine
25.09.2018
23:57:37
PRoSToC0der
25.09.2018
23:58:11
видимо, в variant<auto> надо будет объяснять это variant<auto> кастомной выводилке
в том случае с parse кстати прокатит и просто std::variant<auto> да, потому что я предполагаю, что вместо auto компилятор подставит все типы, которые попыталась вернуть функция

в случае с parse это float, int, std::string

Constantine
25.09.2018
23:59:11
вообще интересно если возвращаемое значение будет user_auto_deductor_t<variant<typename...»

что делать с рекурсией интересно

user_auto_deductor_unknown?

PRoSToC0der
25.09.2018
23:59:35
variant_combine_t<auto> parse(std::string s) { /*...*/ }
т.е. уже так std::variant<auto> parse(std::string s) { /*...*/ }

что делать с рекурсией интересно
с прямой рекурсией - return same_fun(/*...*/); видимо ничего сделать нельзя

Constantine
26.09.2018
00:01:13
с прямой рекурсией - return same_fun(/*...*/); видимо ничего сделать нельзя
там сейчас работает потому что первый return гарантирует результат

PRoSToC0der
26.09.2018
00:02:29
Constantine
26.09.2018
00:03:38
с чистым auto да, а тут у нас уже std::variant<auto>
в общем кажется, что user_defined_auto_deduction мы не решим

хотя очень хочется иметь ветки nullopt

а вот typedef throws(checked_exceptions) some_type мы наверное решим

Google
Constantine
26.09.2018
00:05:19
в синтаксисе саттера причем, считаем что throws(true) это throws (true -> any_type)

PRoSToC0der
26.09.2018
00:05:47
в общем кажется, что user_defined_auto_deduction мы не решим
придумай пример с рекурсией, пожалуйста, мне ничего адекватного в голову не лезет, хотя уже начинаю понимать в чём проблема

Constantine
26.09.2018
00:06:12
auto fib(int x) { if (x <= 1) return 1; return fib(x - 1) + fib(x - 2); }

текущие правила говорят ОК, потому что return 1 дает int и int+int это int

PRoSToC0der
26.09.2018
00:07:46
с этим понятно, но хочется пример под std::variant<auto> или какой-нибудь common_type_t<auto>

Constantine
26.09.2018
00:08:17
ну там рекурсия это непонятный тип, он же self dependent

PRoSToC0der
26.09.2018
00:08:20
хотя с common_type можно тот же фибоначчи переделать

Constantine
26.09.2018
00:08:23
будет парадокс

common_type_t<auto> не будет работать, да

он должен получить unspecified_auto в качестве аргумента

PRoSToC0der
26.09.2018
00:10:06
std::common_type_t<auto> fib(int x) { if (x <= 0) return int{1}; if (x == 1) return long{1}; return fib(x - 1) + fib(x - 2); }

сложновато придумать какую-то эвристику когда это должно работать, а когда должно выдавать ошибку, чтобы не уходить в бесконечную рекурсию

Roman
26.09.2018
00:12:51
Вопрос: int * p = new int[0]; UB или нет ?

По факту наблюдаю что оно аллоцирует один байт

Это стандартно, или implementation-specific?

Если стандартно, то зачем. Не лучше ли вернуть nullptr ?

Evgeniy
26.09.2018
00:17:38
Вопрос: int * p = new int[0]; UB или нет ?
> The effect of dereferencing a pointer returned as a request for zero size is undefined.

https://stackoverflow.com/questions/1087042/c-new-int0-will-it-allocate-memory

Alexander
26.09.2018
00:18:51


Roman
26.09.2018
00:19:17
Ты на CppCon сидишь?

Google
Alexander
26.09.2018
00:19:27
Да

Roman
26.09.2018
00:19:31
Крутооо ??

PRoSToC0der
26.09.2018
00:20:20
можно уже облизываться?

По факту наблюдаю что оно аллоцирует один байт
а что будет если несколько раз выделить? какие адреса будут?

Roman
26.09.2018
00:22:00
PRoSToC0der
26.09.2018
00:22:21
Там выше есть ссылка на stackoverflow
это понятно, но интересует конкретное поведение

Roman
26.09.2018
00:22:40
PRoSToC0der
26.09.2018
00:22:43
будут ли одинаковые адреса например

Roman
26.09.2018
00:23:01
Под linux адреса разные

т.е. зарезервированного адреса под нулевые аллокации у него нет

PRoSToC0der
26.09.2018
00:23:37
пример кода сфоткаешь?)

Roman
26.09.2018
00:24:07
более того, если перегрузить operator new, то он просит именно байт. Так что возможно по другому сделать нельзя

пример кода сфоткаешь?)
А что фоткать, код лежит

Alexander
26.09.2018
00:24:49
пример кода сфоткаешь?)
Не было нормальных примеров на слайдах

PRoSToC0der
26.09.2018
00:24:50
А что фоткать, код лежит
под скомбинированный пропозал?

или там не про скомбинированный пропозал?

Alexander
26.09.2018
00:25:09
А просто с примерами модулей лучше просто играться

Roman
26.09.2018
00:25:11
https://gcc.gnu.org/svn/gcc/branches/c++-modules/

Alexander
26.09.2018
00:25:27
PRoSToC0der
26.09.2018
00:25:50
Про три пропозала
скомбиненный в них участвует?

или он ещё не готов?

Alexander
26.09.2018
00:33:58
или он ещё не готов?
Скомбиненый смержили, сам пропозал готов

Страница 2379 из 2477