Это именно то, для чего const_cast
. Если вы абсолютно точно знаете, что функция не изменит указанный / ссылочный объект, тогда все в порядке с const_cast
константностью вашего указателя / ссылки, чтобы передать ее в эту функцию, несмотря на обращение к объекту const.
не const_casting из const неопределенного поведения?
Нет. const_cast
само по себе никогда не бывает UB. Но изменение объекта const есть. Поэтому, если вы не можете доказать, что функция, принимающая неконстантный указатель / ссылку, не модифицирует объект, тогда небезопасно передавать ссылку const_cast
ed в эту функцию.
Также рассмотрите возможность изменения реализации в будущем для использования неконстантности.
В случае, если вы не можете доказать, что неконстантально указанный / заостренный объект не будет изменен, вы можете сделать локальную копию константно ссылаемого аргумента вашей функции-оболочки. Издержки этой копии могут быть тривиальными (int
) или нетривиальными (long std::vector
).
Если вы не можете доказать, что объект не будет изменен, а копирование дорого (или невозможно), то в качестве последнего средства вам нужно избавиться от постоянства вашего собственного аргумента (и распространить изменение до вызова цепь). Или используйте другой API в реализации.