С ++ 20? модули - нет вывоза рядовых

Смотрел 2 выступления CppCon Габриэля Дос Рейса о модулях TS.

И, насколько я помню, он не хотел экспортировать какие-либо частные элементы / функции, поэтому другие модули не смогут их использовать вообще.

Я понимаю его позицию, но не будет ли это противоречить будущему отражению в C++? Например, когда в C++ есть отражение, которое может перечислять все функции класса, разве он не может также перечислять частные функции?

Я знаю, доступ к закрытым функциям плох, но в редких крайних случаях это необходимо (как иногда необходим const_cast, несмотря на то, что разработчик, который пишет, должен чувствовать себя ужасно)

Редактировать:

И есть по крайней мере одно исключение для "не разоблачения рядовых" - если классы используют шаблон "не виртуальный интерфейс"

1 ответ

Решение

Модули не изменяют (как определено в настоящее время) принципы работы C++ на фундаментальном уровне. Это несколько меняет то, какие имена доступны и откуда они доступны. Но это не меняет того, как язык работает с этими именами.

Таким образом, если статическое отражение приходит и позволяет вам говорить о частных членах класса, то вы можете говорить о частных членах класса. Пришло ли вам определение этого класса через директиву #include или включение модуля - не имеет значения.

Чтобы разрешить то, что хочет Габриэль Дос Рейс, потребуется явное исключение из правил отражения. И это вряд ли произойдет.

И это не так уж важно. Хотя возможность удаления из файлов модулей приватных членов (и любых неэкспортированных типов, с которыми они работают) сделает файлы модулей немного меньше, я не думаю, что этот дополнительный размер файла модуля будет таким большим делом. Главное, что это позволит вам сделать, - это внести определенные изменения в исходный код модуля, которые не потребуют перекомпиляции модулей, включающих ваш модуль. Но в любом случае хорошо модульная кодовая база должна иметь относительно быструю компиляцию. Так что, хотя это было бы хорошо, это вряд ли необходимо.

Другие вопросы по тегам