1. Немного расскажу про эпохи.
Это такой механизм, который предлагается использовать для обратнонесмовместимых изменений в C++, но при этом не ломать эту обратную совместимость всем, кто не хочет.
Предлагается ввести новое ключевое слово
epoch, которое опционально можно писать в начале вашего модуля (именно модуля):epoch 2023;В пропозале предлагается следующий пример: в C++ существуют неявные приведения. Потому такой код компилируется:
module f;void f(float) {}
...
f(3.4); // 3.4 is doubleОднако если указана конкретная эпоха, с которой запрещаются неявные приведения, код будет падать с ошибкой компиляции:
epoch 2023;
module f;
void f(float) {}
...
// f(3.4); // CE
f(3.4f); // successТ.к. это модулеспецифичная опция, предполагается, что вы можете безопасно без проблем модуль за модулем мигрировать на новую эпоху (мигрировать бы на модули сначала😢).
Новая эпоха будет появляться с появлением нового стандарта и выражаться четырёхзначным числом, которое является годом выхода этой эпохи. Соответственно вы просто сможете компилировать свой код в привычном формате
-std=standard. Однако эпохи не являются инструментом для ломания ABI. Они лишь предлагаются как некоторый инструмент для другого преобразования кода в AST, после чего компиляция идёт обычным способом. Тут конечно грустно.
В пропозале есть ещё несколько примеров, которые можно починить эпохами. Вот несколько интересных (обратите внимание, что пропозал предлагает только эпохи и примеры ниже демонстрируют, какие необычные изменения можно будет ввести в язык без боли):
- оставить переменную неинициализированной:
// int i; // CE
int i = void; // OK, unitialized- запретить устаревшие конструкции:
// int a0[]{1, 2}; // CE
std::array<int> a1{1, 2}; // OK
// typedef int I0; // CE
using I1 = int; // OK- ввести новые/переименовать существующие ключевые слова (
co_await -> await, co_yield -> yield);- форсить использование
nullptr вместо NULL или 0;- форсить использование
break и fallthrough в switch;- юзание условного
std::movable_initializer_list вместо обычного там, где это возможно;- форсить для конструкторов использование одного из двух слов:
explicit, implicit;- форсить одно из слов
const/mutable для переменных;- следить за выполнением некоторых core guidlines на уровне языка;
- добавить ещё несколько атрибутов для методов/функций вроде
[[accessible_until_epoch(X)]] и [[accessible_since_epoch(X)]]и другие.
Короч прикольно, но шо-то как-то не прям то, что хотелось. Опять же, ABI либо придётся когда-то сломать (уже может быть довольно поздно), либо мы все так и умрём в пережитках прошлого (или нет, я хз).
Proposal.
2. Небольшая статья про то, как можно использовать макрос
__has_include и feature test макросы. 3. Какая-то забавная интересная статья про то, как чуваки своего начальника продавали.