Разрешают ли модули наконец-то читаемые имена в стандартной реализации библиотеки? - PullRequest
4 голосов
/ 09 марта 2020

С введением модулей в C ++ 20 у нас наконец появился инструмент для инкапсуляции кода друг от друга. Тем более, что макросы препроцессора не проникают в другие модули.

Afaik, зарезервированные имена (такие как _Tp, _First, __last) были введены во избежание путаницы макросов в реализации стандартной библиотеки, например:

#define first Yabba Dabba Doo

template <typename RanIt>
std::sort(RanIt first, RanIt last);

Я знаю, что стандартная библиотека не будет модульной для C ++ 20, но, вероятно, для C ++ 2x. Может ли модульная реализация стандартной библиотеки, наконец, разрешить нормальные, читаемые имена для таких вещей, как параметры и внутренние типы (без ошибок UB или ошибок компилятора), или есть какое-то другое ограничение, блокирующее это?

1 Ответ

3 голосов
/ 09 марта 2020

Да, реализация стандартной библиотеки, специально предназначенная для интерфейса на основе модулей, будет изолирована от пользовательских макросов и, следовательно, может использовать «нормальные» имена. Ну, может быть; Я расскажу об этой возможности в конце.

Несмотря на это, я не ожидал бы, что это произойдет в ближайшем будущем, даже после гипотетического C ++ 23 с библиотеками в модулях.

причина в том, что вам все еще нужно будет иметь возможность #include стандартных заголовков, даже в модульном коде. Таким образом, эти заголовки должны быть по-прежнему доступны. И хотя компилятор может юридически преобразовать #include <vector> непосредственно в import std.vector (при условии, что оба определяют одно и то же), это может быть нарушением обратной совместимости для пользователей этой платформы, которые могут добавить несколько #define до #include. Если бы вы import std.vector.

не ожидали аналогичных ожиданий, учитывая, что вам по-прежнему понадобятся стандартные заголовки библиотек, маловероятно, что любая реализация захочет поддерживать 2 копии стандартного библиотечного кода: один для заголовков и один для модулей. Должно быть проще определить модули стандартной библиотеки с помощью #include соответствующих заголовков и export указанных c символов из них.

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

. Существует одна проблема, которая может сделать это невозможным. Модули по-прежнему должны иметь дело с внешними определениями, не из пользовательского кода до #include, а из переключателей компилятора. Люди будут использовать такие переключатели для параметризации своих модулей, и это нормально. Однако такие переключатели находятся за пределами области стандарта, поэтому неясно, придется ли реализациям защищаться от них или нет.

...