namespace private типы

ya.imdex
ya.imdex
namespace example {
    private class Private {};

    class Public {
        Private field; // Ок, так как тип Public в том же неймспейсе, что и Private
    };
}

namespace other {
    class Foo {
        example::Private field; // Ошибка компиляции

        example::Public field; // Ок
    };
}

Тип помеченный как private может быть использован только в рамках своего пространства имен. Вложенным пространствам имен можно также разрешить использовать этот тип или, как вариант, использовать для таких случаев protected.

Сейчас это делается вспомогательным неймспейсом detail, который никак не защищает от использования извне и засоряет подсказки автодополнения.

22
рейтинг
5 комментариев
mrgordonfreman
Вроде модули должны решить эту проблему - детали реализации просто не будут помечаться как интерфейс модуля
mrgordonfreman
ya.imdex
Текущие реализации модулей не затрагивают пространства имен. Речь в них идет только о module private типах.
ya.imdex
yndx-antoshkka
Предлагаю расширить ещё и на namespace:

namespace boost { private namespace detail { /* ... */ }}

Как вам предложение?
yndx-antoshkka
ya.imdex
yndx-antoshkka, впринципе подобный механизм может (и скорее всего должен) работать для всех возможных объявлений внутри пространства имен.
ya.imdex
mr.obvious
Так недолго и до конструкторов неймспейса.
mr.obvious
Другие идеи
Группа создана, чтобы собирать предложения к стандарту C++, организовывать их внутренние обсуждения, помогать готовить их для отправки в комитет и защищать на общих собраниях в рабочей группе по С++ Международной организации по стандартизации (ISO).