Они там на самом деле не правы или, по крайней мере, не рассказывают всей истории об этом. Настоящая причина, по которой он запрещен, заключается в том, что он нарушает правило одного определения (которое, кстати, также упоминается как вторая причина, почему оно незаконно).
Чтобы увидеть, что на самом деле разрешено (переопределять ключевые слова), по крайней мере, если вы не используете стандартные библиотеки, вам нужно взглянуть на совершенно другую часть стандарта, а именно на этапы перевода. Это говорит о том, что входные данные раскладываются только в токены препроцессора до того, как происходит предварительная обработка, и, глядя на те, между private
и fubar
нет различия, они оба identifiers
для препроцессора. Позже, когда входная информация разлагается на token
, замена уже произошла.
Было отмечено, что существует ограничение на программы, которые должны использовать стандартные библиотеки, но не очевидно, что пример, переопределяющий private
, делает это (в отличие от «Лица № 4: Языковой адвокат»). фрагмент, который использует его для вывода на cout
).
В последнем примере упоминается, что уловка не попирает другие единицы перевода или не попирает другие. Имея это в виду, вам, вероятно, следует рассмотреть возможность использования стандартной библиотеки где-то еще, что приведет к введению этого ограничения.