- 01
- 02
- 03
- 04
- 05
- 06
- 07
- 08
- 09
- 10
- 11
- 12
- 13
- 14
- 15
- 16
- 17
- 18
- 19
- 20
- 21
- 22
#include <cstdio>
class tag;
template<class>
struct type { friend constexpr auto get(type); };
template<class TKey, class TValue>
struct set { friend constexpr auto get(TKey) { return TValue{}; } };
void foo() { // never called
if constexpr(false) { // never true
if (false) { // never true
constexpr auto call = [](auto value) { std::printf("called %d", value); };
void(set<type<tag>, decltype(call)>{});
}
}
}
int main() {
get(type<tag>{})(42); // prints called 42
}
guestinxo 22.10.2019 00:40 # +3
но нет
guest8 22.10.2019 00:54 # −999
guestinxo 22.10.2019 00:59 # 0
guestinxo 22.10.2019 01:02 # 0
guestinxo 22.10.2019 01:08 # 0
guest8 22.10.2019 01:15 # −999
guestinxo 22.10.2019 01:17 # 0
guest8 22.10.2019 01:19 # −999
guest8 22.10.2019 01:22 # −999
guest8 22.10.2019 03:22 # −999
guest8 22.10.2019 03:33 # −999
guest8 22.10.2019 04:13 # −999
BATHbIu_nemyx 22.10.2019 01:28 # 0
Главным героем фильма является Данила Багров — молодой человек неопределённого рода занятий и без определённого места жительства. Герой вырос в неполной семье в бедном и безымянном захолустье — многие посмотревшие фильм ассоциировали героя Бодрова с собой и хотели быть на него похожим — хотели строить так сказать свою жизнь по тем же клише. Важная деталь — в прошлом герой служил и воевал, однако не страдает никаким ПТСР, наоборот — служба в армии и война помогла стать ему настоящим мужчиной и научила чётко и ровно решать вопросы.
Враги главного героя — всякие коммерсы, которые занимаются непонятно чем, но главный враг Данилы — живёт за океаном и появляется только во втором фильме. Это — пиндосы. Именно заокеанские пиндосы являются средоточием мирового зла и проецируют все проблемы для Родины Данилы — к примеру, занимаются обманом наших спортсменов, а когда этот обман вскрывается — убивают их. Ещё пиндосы занимаются наркотрафиком, съёмками порнографии и угнетают негров.
guest8 22.10.2019 15:04 # −999
guest8 22.10.2019 15:07 # −999
nyTuH_nugop 23.10.2019 06:44 # −102
guest8 22.10.2019 01:26 # −999
guest8 22.10.2019 01:30 # −999
guest8 22.10.2019 01:33 # −999
Dpyrou_Pycoqpo6_CEMA 23.10.2019 11:50 # +1
guestinxo 22.10.2019 01:28 # 0
guest8 01.11.2019 01:12 # −999
govninho 01.11.2019 04:19 # 0
guest8 01.11.2019 14:43 # −999
guest8 01.11.2019 14:51 # −999
guest8 01.11.2019 15:32 # −999
MAKAKA 01.11.2019 16:45 # 0
Ruster 01.11.2019 23:57 # 0
guest8 22.10.2019 01:30 # −999
guestinxo 22.10.2019 01:31 # 0
guest8 22.10.2019 01:35 # −999
guestinxo 22.10.2019 01:40 # 0
guest8 22.10.2019 01:41 # −999
guest8 22.10.2019 02:56 # −999
guest8 22.10.2019 03:08 # −999
guest8 22.10.2019 03:30 # −999
guest8 22.10.2019 03:40 # −999
guest8 22.10.2019 03:46 # −999
guest8 22.10.2019 03:52 # −999
guest8 22.10.2019 03:57 # −999
guest8 22.10.2019 04:04 # −999
guest8 22.10.2019 04:29 # −999
guest8 22.10.2019 04:36 # −999
j123123 23.10.2019 03:45 # 0
Как и первая версия крестоговняного "компилятора" Cfront, которая по сути являлась говнопрепроцессором поверх сишки. А первые версии сишкокомпиляторов были кривыми говнотрансляторами в ассемблер PDP-11
MAKAKA 23.10.2019 03:59 # 0
У жабы нет генериков в компайл тайме ради совместимости с говном 1998 года, например
Desktop 25.10.2019 12:39 # 0
До скорой встречи!
Перфоманс
Louie_Louie 22.10.2019 11:03 # 0
guest8 22.10.2019 01:44 # −999
guestinxo 22.10.2019 01:45 # 0
guest8 22.10.2019 15:03 # −999
j123123 24.10.2019 16:28 # 0
guest8 24.10.2019 16:35 # −999
lha 25.10.2019 07:33 # +1
https://gcc.godbolt.org/z/U-fv8o
1. Тело функции foo состоит из nop, поскольку там if constexpr(false).
2. Но эта пустая функция на этапе компиляции создаёт специализацию шаблона set<type<tag>, decltype(call)>.
3. Её френд по имени get (в ассемблерном выхлопе метка _ZZ3foovENKUlT_E_clIiEEDaS_) возвращает экземпляр класса, переданного во втором аргументе (т. е. создаёт экземпляр decltype(call)).
4. В свою очередь decltype(call){}() в C++20 приводит к вызову лямбды (только без захвата контекста; замыкания через конструктор вызвать не получится).
Осталось понять, почему вызвана функция _ZZ3foovENKUlT_E_clIiEEDaS_, она же set<type<tag>, decltype(call)>::get(type<tag>), чья специализация родилась в недрах foo. Тропинка к ней от вызова get(type<tag>{})(42) в main появилась благодаря SFINAE: это функция, максимально подходящая под сигнатуру get(type<tag>).
Перед лямбдой, кстати, вызывается конструктор type<tag>{}, и он пустой.
PolinaAksenova 18.04.2021 13:47 # 0
class tag же нужен для того, чтобы объявление get(type<tag>) было т.н. "templated entity" ([temp.pre]/8) — иняче определение get() из set<> ня сматчится с объявлением.
MAPTOBCKuu_nemyx 12.05.2024 06:09 # 0
guestinxo 22.10.2019 01:22 # 0
j123123 22.10.2019 13:34 # 0
nuTepcKuu_nemyx 18.04.2021 11:48 # +1
someone 24.10.2019 11:44 # 0
Хотя всё равно непонятно, какого чёрта он пытается использовать эту лямбду внутри foo.
cvs 24.10.2019 14:32 # 0
Переписал без лямбды:
https://ideone.com/CKQgWG
Всё равно лезет в блок, который внутри if (false), который внутри if constexpr(false), который внутри void foo(), которая никогда не вызывается.
lha 25.10.2019 04:25 # 0
https://cppinsights.io/s/e5c7acb2
someone 25.10.2019 18:11 # 0
Ruster 01.11.2019 23:57 # 0
whois 03.11.2019 01:57 # 0
lha 25.10.2019 04:43 # 0
lha 25.10.2019 05:17 # 0
Но в компиляторах до C++20 выкинет с сообщением об ошибке:
Конструктор с атрибутом deleted перекрыть не получается. Либо это невозможно, либо я слишком анскилльный.
lha 25.10.2019 06:54 # 0
Заменил вызов конструктора вызовом статического метода. Компилируется в C++17 (если бы не if constexpr, можно было бы ещё понизить версию стандарта).
lha 25.10.2019 07:42 # 0
lha 25.10.2019 04:27 # 0
https://cppinsights.io/s/6a95dc50
bormand 10.11.2019 11:17 # 0
j123123 10.11.2019 20:01 # 0
Ну и вот еще https://habr.com/ru/post/268141/ https://stackoverflow.com/questions/44267673/is-stateful-metaprogramming-ill-formed-yet