С ++ 20? модули - нет вывоза рядовых
Смотрел 2 выступления CppCon Габриэля Дос Рейса о модулях TS.
И, насколько я помню, он не хотел экспортировать какие-либо частные элементы / функции, поэтому другие модули не смогут их использовать вообще.
Я понимаю его позицию, но не будет ли это противоречить будущему отражению в C++? Например, когда в C++ есть отражение, которое может перечислять все функции класса, разве он не может также перечислять частные функции?
Я знаю, доступ к закрытым функциям плох, но в редких крайних случаях это необходимо (как иногда необходим const_cast, несмотря на то, что разработчик, который пишет, должен чувствовать себя ужасно)
Редактировать:
И есть по крайней мере одно исключение для "не разоблачения рядовых" - если классы используют шаблон "не виртуальный интерфейс"
1 ответ
Модули не изменяют (как определено в настоящее время) принципы работы C++ на фундаментальном уровне. Это несколько меняет то, какие имена доступны и откуда они доступны. Но это не меняет того, как язык работает с этими именами.
Таким образом, если статическое отражение приходит и позволяет вам говорить о частных членах класса, то вы можете говорить о частных членах класса. Пришло ли вам определение этого класса через директиву #include или включение модуля - не имеет значения.
Чтобы разрешить то, что хочет Габриэль Дос Рейс, потребуется явное исключение из правил отражения. И это вряд ли произойдет.
И это не так уж важно. Хотя возможность удаления из файлов модулей приватных членов (и любых неэкспортированных типов, с которыми они работают) сделает файлы модулей немного меньше, я не думаю, что этот дополнительный размер файла модуля будет таким большим делом. Главное, что это позволит вам сделать, - это внести определенные изменения в исходный код модуля, которые не потребуют перекомпиляции модулей, включающих ваш модуль. Но в любом случае хорошо модульная кодовая база должна иметь относительно быструю компиляцию. Так что, хотя это было бы хорошо, это вряд ли необходимо.