9:33, "А можно ли устроить такой взрыв, который никогда не кончится?" Полагаю, что могу без привлечения математики ответить на этот вопрос. Да, с помощью decltype([]{}) в C++20 мы можем добиться теоритически бесконечной цепочки инстанцирований. Для этого достаточно decltype от лямбды сделать дефолтным шаблонным параметром. Тогда, при каждом инстанцировании, мы будем брать тип от разных уникальных лямбд. Это возможно и в более ранних версиях языка с (большими) оговорками, но было серой зоной стандарта и не все компиляторы справлялись, а те, которые справлялись - делали это очень по-разному
Стандарт в отношении перегрузки шаблонов функций это бездны. Ответ есть, но я его подробно разберу в том курсе (тоже на этом канале) где говорю про стандарт и тонкие вопросы. С другой стороны именно тут этот ответ в документе ищется не так уж сложно. И к счастью да, в основном там будет ambiguous overload
Кроме того, добавлю, что is_detected не добавили в стандартную библиотеку не только в C++17, но даже и в C++20, оно носит статус TS и теперь очень вряд ли появится в стандартной библиотеке, ведь теперь у нас есть концепты и requires, позволяющий сделать то же самое прямо по месту объявления функции одной строкой И трейтов по типу is_same_t в стандартной библиотеке также нет, только is_same_v. Так что сейчас, трейты бывают либо только * _v, либо только *_t, исключений не помню
Интересное дополнение, спасибо. Собственно с введением концепта is_same даже версия с _v уже не слишком нужна. Но это в стандартной библиотеке. Никто же не мешает наделать себе такого в своей программе. И делают
Мне кажется у автора там довольно самобытная позиция по многим вопросам. Момент насчёт void_t с привязкой по времени: ua-cam.com/video/udTEfwCkmaw/v-deo.html Что происходит с моей точки зрения: человек использует механизм неправильно и жалуется, что он не работает. Портить параметры функций SFINAE обёртками это как раз так себе идея и в лекции по метапрограммированию я объясняю какие есть альтернативы. Для своего же круга применений, void_t исключительно хорош и очень часто куда лучше чем enable_if.
Взрыв, который никогда не кончится:
template
class A : public A
{};
int main () {
A a;
}
9:33, "А можно ли устроить такой взрыв, который никогда не кончится?"
Полагаю, что могу без привлечения математики ответить на этот вопрос. Да, с помощью decltype([]{}) в C++20 мы можем добиться теоритически бесконечной цепочки инстанцирований. Для этого достаточно decltype от лямбды сделать дефолтным шаблонным параметром. Тогда, при каждом инстанцировании, мы будем брать тип от разных уникальных лямбд.
Это возможно и в более ранних версиях языка с (большими) оговорками, но было серой зоной стандарта и не все компиляторы справлялись, а те, которые справлялись - делали это очень по-разному
47:03
А есть ответ к этому? :) У меня, если не sfinae, с++17 говорит, что ambiguous overload. Или что-то другое имелось в виду?
Стандарт в отношении перегрузки шаблонов функций это бездны. Ответ есть, но я его подробно разберу в том курсе (тоже на этом канале) где говорю про стандарт и тонкие вопросы. С другой стороны именно тут этот ответ в документе ищется не так уж сложно. И к счастью да, в основном там будет ambiguous overload
Кроме того, добавлю, что is_detected не добавили в стандартную библиотеку не только в C++17, но даже и в C++20, оно носит статус TS и теперь очень вряд ли появится в стандартной библиотеке, ведь теперь у нас есть концепты и requires, позволяющий сделать то же самое прямо по месту объявления функции одной строкой
И трейтов по типу is_same_t в стандартной библиотеке также нет, только is_same_v. Так что сейчас, трейты бывают либо только * _v, либо только *_t, исключений не помню
Интересное дополнение, спасибо. Собственно с введением концепта is_same даже версия с _v уже не слишком нужна. Но это в стандартной библиотеке. Никто же не мешает наделать себе такого в своей программе. И делают
57:03 float& вроде ловится же, просто float иницмализируется float&, проверил в c++17, может что-то другое имелось в виду?
Да в том-то и дело. Мы хотим только функции возвращающие float, а у нас нечто возвращающее float& внезапно тоже пройдёт проверку
@@tilir спасибо за ответы :)
В этом докладе не рекомендуют использовать void_t
ua-cam.com/video/udTEfwCkmaw/v-deo.html
Мне кажется у автора там довольно самобытная позиция по многим вопросам.
Момент насчёт void_t с привязкой по времени: ua-cam.com/video/udTEfwCkmaw/v-deo.html
Что происходит с моей точки зрения: человек использует механизм неправильно и жалуется, что он не работает.
Портить параметры функций SFINAE обёртками это как раз так себе идея и в лекции по метапрограммированию я объясняю какие есть альтернативы.
Для своего же круга применений, void_t исключительно хорош и очень часто куда лучше чем enable_if.