Возможно иметь параметр функции, обеспечивающий следующую семантику:
Параметр не будет изменяться функцией.
Вызов функции никогда не создает копию или временный объект для параметра.
Пример:
void f(const std::string & str);
Интерфейс сообщает клиентам, что параметр не будет изменен, и если параметр уже имеет тип std :: string, копия не создается.
Но все еще можно назвать это
const char * hello = "hello";
f(hello);
, который создает временный объект std :: string перед вводом функции f и уничтожает его снова после выхода из f.
Можно ли запретить это либо с помощью другого объявления функции, либо (гипотетически) изменив реализацию std :: string.