Предположим, что у нас есть объект obj типа myType, и мы хотели бы передать его функции Foo, которая возвращает нам некоторую ценную информацию об obj. function Bar - это где obj объявлено и из которого Foo вызывается следующим образом:
void Bar ()
{
myType obj; //default constructor
string valuableInfo = Foo(obj);
//do other stuff
//...
} //end of Bar()
Этот фрагмент кода, конечно, мало говорит о том, принимает ли Foo obj как ссылку или как значение, и каким образом Foo изменяет obj каким-либо образом.
конечно, если Foo принимает obj как значение или константу ссылки, у нас не будет никаких проблем.
string Foo (const myType & input); //this is fine
string Foo (myType input); //so is this
но мы этого не гарантируем! сигнатура функции вполне может быть
string Foo (myType & input); //asking for trouble!!
но ужасно неудобно проверять подпись каждой функции, которую мы хотели бы передать obj, поэтому как мы можем указать, что мы хотим передать наш объект только тем функциям, которые обещают не изменять его?
конечно, один подход заключается в объявлении obj как const, но проблема с этим подходом заключается в том, что мы теряем гибкость. что, если мы хотим изменить obj в Bar() после вызова Foo (obj)?
void Bar ()
{
const myType obj; //default constructor
string valuableInfo = Foo(obj); //compiler will complain if Foo signature doesnt match
//we can't modify obj here :(
//...
} //end of Bar()
Очевидным, но плохим решением является следующее:
void Bar ()
{
myType obj; //default constructor
const myType immutableObj {obj}; //copy ctr call
//this is expensive and not recommended if obj is big! want to avoid
string valuableInfo = Foo(immutableObj); //will get the valuable Info risk free
// compiler will complain if Foo has inappropriate signature
//do other stuff
//...
} //end of Bar()
Итак, что является лучшим решением здесь? есть ли способ статически утверждать, что Foo не является инвазивным для объекта, в который мы проходим? можем ли мы временно сделать obj const (без создания нового объекта const) или что-то в этом роде?