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
    No fields configured for issues without a type.

    Projects

    No projects

    Milestone

    No milestone

    Relationships

    None yet

    Development

    No branches or pull requests

    Issue actions