-
Notifications
You must be signed in to change notification settings - Fork 0
Open
Description
<Описание вашей идеи>
Увидел, как в расте всё const-by-default. Подумал, как можно реализовать данный функционал в языке c++, при этом:
- чтобы не надо было писать какое-то ключевое слово отдельно вверху файла (смотрю на "module;"), то есть чтобы обозначение было частью определения какой-либо имеющейся сущности для облегчения считывания.
- чтобы была обратная совместимость.
Придумал такое определение:
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;
}
}Преимущества:
- Можно контролируемо вводить const-by-default для модулей кода
- Меньше вероятностей потерять const
- Определение относительно легко считывается.
Основные проблемы:
- Не понятно, будет ли константным возвращаемый тип? Если возвращается по значению, это будто бы не нужно, но тогда логика работы станет неочевидной. В целом, нужно очень подробно прописать правила работы такого ключевого слова из-за обилия языковых фич, что требует необоснованно много времени стандартизаторам и столько же много времени имплементаторам.
- Пользователю библиотеки может оказаться трудно считать const "где-то наверху" (то есть п. 1 в самом верху не решён до конца).
- Не очевидно значение ключевого слова в контексте namespace (может default_const?)
- Как определять константность для членов классов?
- Как это будет взаимодействовать с контрактами?
Возможное развитие:
- Возможность добавлять ещё и noexcept, && (для move-by-default) в качестве спецификаторов
- Переместить данные ключевые слова с уровня неймспейсов на уровень блоков кода (может мешать 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
Labels
No labels