Это своего рода продолжение до этого вопроса
Рассмотрим следующий фрагмент
void f(int const &); // f "guarantees" not to change its parameter
int main()
{
int const a = 42; // a is not modifiable
f(a); // so f definitely can't modify a
// (at least not without invoking UB), that's great
int b = 42; // b is modifiable
f(b); // but f could modify b legally? huh? not so great
}
Мое понимание: f can only измените b, и он должен использовать const_cast для этого. Кроме того, это вообще плохая идея, и ее не следует делать. Кроме того, существуют причины, по которым в языке существует механизм игнорирования const.
Если мое понимание верно, то мой вопрос в том, есть ли способ написать функцию, которая гарантируется не изменять свой аргумент. то есть есть ли способ сделать следующее
void f(int const_really &); // f *guarantees* not to change its parameter
int main()
{
int b = 42; // even if b is modifiable
f(b); // f is not allowed to modify b legally
// (or is UB if it does)
}
Редактировать: Одной из причин для этого было бы позволить компилятору выполнять оптимизацию. В настоящее время функция, которая принимает аргумент по const-reference, имеет значение , а не , позволяющее предположить, что биты аргумента не будут изменены функцией. Это связано с тем, что функция может выполнять допустимое const_cast или тип аргумента может иметь изменяемые члены.
Если функция может полагаться на аргумент, который не изменяется, то я предполагаю, что некоторые могут быть выполнены виды оптимизации (аналогично оптимизации всей программы, которая доказывает аргумент никогда не изменяется).
Может ли это быть что-то, что можно добавить в язык?
Если нет, есть ли какая-то причина, почему это никогда не может быть сделано?