Параметр ссылочной функции const: возможно ли запретить временные объекты? - PullRequest
0 голосов
/ 07 мая 2018

Возможно иметь параметр функции, обеспечивающий следующую семантику:

Параметр не будет изменяться функцией. Вызов функции никогда не создает копию или временный объект для параметра.

Пример:

void f(const std::string & str);

Интерфейс сообщает клиентам, что параметр не будет изменен, и если параметр уже имеет тип std :: string, копия не создается.

Но все еще можно назвать это

const char * hello = "hello";
f(hello);

, который создает временный объект std :: string перед вводом функции f и уничтожает его снова после выхода из f.

Можно ли запретить это либо с помощью другого объявления функции, либо (гипотетически) изменив реализацию std :: string.

1 Ответ

0 голосов
/ 07 мая 2018

Я собираюсь начать с конца здесь.

или (гипотетически) изменив std::string реализацию

Не делай этого из страха перед носовыми демонами. Серьезно, не надо. Пусть стандартная библиотека ведет себя стандартным образом.

Можно ли это запретить, либо с помощью другого объявления функции

Еще одна декларация - просто билет. Добавьте перегрузку, которая принимает ссылку на r-значение, и определите ее как удаленную:

void f(std::string && str) = delete;

Разрешение перегрузки выберет его для временных значений, а удаленное определение вызовет ошибку. Ваша предполагаемая функция теперь может вызываться только с l-значениями.

...