Skip to content

const-by-default через "const namespace" #630

@Lombeelo

Description

@Lombeelo

<Описание вашей идеи>

Увидел, как в расте всё const-by-default. Подумал, как можно реализовать данный функционал в языке c++, при этом:

  1. чтобы не надо было писать какое-то ключевое слово отдельно вверху файла (смотрю на "module;"), то есть чтобы обозначение было частью определения какой-либо имеющейся сущности для облегчения считывания.
  2. чтобы была обратная совместимость.

Придумал такое определение:

const namespace foo {
    int bar(int& a, float& b)
    {
        mutable int c = a;
        c += b;
//     a += b;  compilation error! (a is const&)
        return c;
    }
}

Что аналогично

namespace foo {
    const int bar(const int& a, const float& b)
    {
        int c = a;
        c += b;
//     a += b;  compilation error! (a is const&)
        return c;
    }
}

Преимущества:

  1. Можно контролируемо вводить const-by-default для модулей кода
  2. Меньше вероятностей потерять const
  3. Определение относительно легко считывается.

Основные проблемы:

  1. Не понятно, будет ли константным возвращаемый тип? Если возвращается по значению, это будто бы не нужно, но тогда логика работы станет неочевидной. В целом, нужно очень подробно прописать правила работы такого ключевого слова из-за обилия языковых фич, что требует необоснованно много времени стандартизаторам и столько же много времени имплементаторам.
  2. Пользователю библиотеки может оказаться трудно считать const "где-то наверху" (то есть п. 1 в самом верху не решён до конца).
  3. Не очевидно значение ключевого слова в контексте namespace (может default_const?)
  4. Как определять константность для членов классов?
  5. Как это будет взаимодействовать с контрактами?

Возможное развитие:

  1. Возможность добавлять ещё и noexcept, && (для move-by-default) в качестве спецификаторов
  2. Переместить данные ключевые слова с уровня неймспейсов на уровень блоков кода (может мешать const для методов классов, да и громоздко). Это позволит, например, делать virtual override блоки.
namespace foo {

const {
    int bar(int& a, float& b)
    {
        mutable int c = a;
        c += b;
//     a += b;  compilation error! (a is const&)
        return c;
    }
}

}

<Примеры, где ваша идея будет полезна. Чем больше примеров и чем большую аудиторию они охватывают - тем лучше>

Идея полезна, когда очень много неизменяемых переменных внутри кода, когда очень-очень-очень много const'ов и хочется немного облегчить написание кода. Также, заложенная идея крайне масштабируема с прочими ключевыми словами языка.

Metadata

Metadata

Assignees

No one assigned

    Labels

    No labels
    No labels

    Type

    No type

    Projects

    No projects

    Milestone

    No milestone

    Relationships

    None yet

    Development

    No branches or pull requests

    Issue actions