C++ Moscow: post #87 — TG.ME

Наш редакторский состав несколько недель боролся с хворью, но в конечном итоге победил и возвращается, чтобы радовать вас плюсовыми постами.

На последнем плюсовом митапе был поднят очень интересный вопрос: почему следующий код компилируется и gcc и clang и успешно выполняется, когда, казалось бы, согласно [module.global.frag], совсем не должен (см. объяснение Константина Владимирова)?

// global.hpp
#include <iostream>
template <typename T> void dump(T val) { std::cout << val << std::endl; }


// global.cppm
module;
#include "global.hpp"
export module global;
export template <typename T> void output(T item) { dump(item); }


// main.cpp
import global;
int main() { output(42); }


Мы честно пытались это нагуглить, но у нас не получилось. Каким образом в данном примере происходит инстанцирование? clang и gcc сохраняют в pcm дополнительные данные, необходимые для него? Если вы знаете секрет этих колдунств — мы с радостью ждем вас в комментариях. Если не знаете — ждём вас не менее. Разберёмся в компиляторной магии вместе!
YouTube
Магистерский курс C++ (МФТИ, 2022-2023). Лекция 6. SFINAE.
Лекции в магистратуре МФТИ по современному C++ на русском языке. Кафедра микропроцессорных технологий. Эта лекция посвящена инстанцированию. Мы сначала разовьём тему инстанцирования для модулей, а дальше посмотрим на SFINAE и на его внезапные, хотя иногда…
👍6🔥3😴1
December 4, 2023 769 1 5