gcc lambda bug


Конец апреля. Снег? Точно снег, я даже пожевал его, чтоб убедиться. Снег и некоторые органические вкрапления. Тихие всхлипы из подвального помещения взрезали тишину холодного белого утра. Это дворник Михалыч испытывал колоссальные нравственные страдания, вынужденный променять метелку обратно на снеговую лопату. Вдалеке послышался многоголосый леденящий душу вой - стали просыпаться оптимисты-автомобилисты. Наверное, я попал в прошлое, обратно в февраль. Это единственное объяснение. Если нет, то это какой-то страшный баг.
Кстати, вся эта возня с багом 85282 навела меня на мысль, что внутриклассовая спецификация могла бы защитить некоторые методы в шаблонном классе от незаконной перегрузки и доступа через нелегально перегруженный метод к закрытым членам класса.
𝚜𝚝𝚛𝚞𝚌𝚝 𝚄 {
𝚝𝚎𝚖𝚙𝚕𝚊𝚝𝚎 <𝚌𝚕𝚊𝚜𝚜 𝚃>
𝚟𝚘𝚒𝚍 𝚘𝚙𝚎𝚛𝚊𝚝𝚘𝚛()() 𝚌𝚘𝚗𝚜𝚝 {}
𝚝𝚎𝚖𝚙𝚕𝚊𝚝𝚎 <> 𝚟𝚘𝚒𝚍 𝚄::𝚘𝚙𝚎𝚛𝚊𝚝𝚘𝚛()<𝚒𝚗𝚝>() 𝚌𝚘𝚗𝚜𝚝 {}
}
Теперь никто не сможет перехватить вызов operator()<int>() снаружи.
𝚝𝚎𝚖𝚙𝚕𝚊𝚝𝚎 <>
𝚟𝚘𝚒𝚍 𝚄::𝚘𝚙𝚎𝚛𝚊𝚝𝚘𝚛()<𝚒𝚗𝚝>() 𝚌𝚘𝚗𝚜𝚝 {
// доступ к закрытым членам класса
}
Это бы могло пригодиться для генерации лямбд, если каждый operator() инстанцировался внутри уникального класса, то перегрузить эти операторы не было бы никакой возможности. Хотя стоп, это и так запрещено:
В разделе стандарта про лямбды 7.5.5.2
Closure types [expr.prim.lambda.closure]
было указано в пункте 16:

Член замыкания не может быть явно инстанцирован, явно специализирован или указан во friend декларации.

Это значит, что мы не можем распоряжаться членом лямбды operator() как нам взбредет в голову. Взбрести может всякое. Не пытайтесь представить, эти картины сведут вас с ума.
Лямбда - это же не просто ценный мех и синтаксический сахарок, это же некая особая сущность! Вот и стандарт это подтверждает. Правда, GCC?
А GCC, отвернувшись, глядит куда-то вверх, будто он тут ни при чем:
𝚊𝚞𝚝𝚘 𝚡 = []<𝚌𝚕𝚊𝚜𝚜 𝚃>() -> 𝚟𝚘𝚒𝚍 {
// что-то делаем
};
Тогда я беру обычную лямбду уникального типа...
𝚞𝚜𝚒𝚗𝚐 𝚇 = 𝚜𝚝𝚍::𝚍𝚎𝚌𝚊𝚢_𝚝<𝚍𝚎𝚌𝚕𝚝𝚢𝚙𝚎(𝚡)>;
Как тебе такое, GCC? Теперь мы знаем ее тип...
𝚝𝚎𝚖𝚙𝚕𝚊𝚝𝚎<>
𝚟𝚘𝚒𝚍 𝚇::𝚘𝚙𝚎𝚛𝚊𝚝𝚘𝚛()<𝚒𝚗𝚝>() 𝚌𝚘𝚗𝚜𝚝 { /* хаха, перехватили вызов */ }
Нет! GCC, да что ты творишь, почему ты компилируешь такое? Тебе вообще стандарт не указ?
Вот clang так не дает делать:
𝚎𝚛𝚛𝚘𝚛: 𝚕𝚊𝚖𝚋𝚍𝚊 𝚌𝚊𝚕𝚕 𝚘𝚙𝚎𝚛𝚊𝚝𝚘𝚛 𝚜𝚑𝚘𝚞𝚕𝚍 𝚗𝚘𝚝 𝚋𝚎 𝚎𝚡𝚙𝚕𝚒𝚌𝚒𝚝𝚕𝚢 𝚜𝚙𝚎𝚌𝚒𝚊𝚕𝚒𝚣𝚎𝚍 𝚘𝚛 𝚒𝚗𝚜𝚝𝚊𝚗𝚝𝚒𝚊𝚝𝚎𝚍
И это чертовски правильно!
Что же, не будем судить строго, однако это творожный сигнал. Похоже, это какие-то фундаментальные архитектурные проблемы не позволяют исправить баг двадцатилетней давности и напротив позволяют так грубо нарушать стандарт. Как обычно, все выводы на нашем канале вы делаете сами, но все всё понимают.
Просмотры: 19
Открыть в MAX Сообщить о неточности

Репосты публикации

Публикация канала

Сообщить о неточности

Опишите, что нужно исправить. Если есть источник, добавьте ссылку.

Вы покидаете datool.ru

Ссылка ведёт на внешний сайт. datool.ru не отвечает за его содержимое — проверьте адрес, прежде чем вводить пароли или платёжные данные.

Переход через 10 с

Перейти