У меня есть внешняя библиотека, которую я не могу изменить. Библиотека объявляет функцию шаблона, которая почему-то возвращает const
объект без ссылки:
template<class C>
const C foo();
У меня есть еще одна внешняя библиотека, которую я тоже не могу изменить. Библиотека объявляет класс, который не копируется, и имеет конструктор перемещения только из неконстантного объекта:
struct bar {
bar();
bar(const bar&)=delete;
bar(bar&&);
};
Теперь мне нужно использовать foo<bar>
. Простое использование:
bar buz() {
return foo<bar>();
}
не работает с
main.cpp: In function 'bar buz()': main.cpp:13:21: error: use of deleted function 'bar::bar(const bar&)' return foo<bar>(); ^ main.cpp:8:5: note: declared here bar(const bar&)=delete; ^~~
что имеет смысл, и никакое простое обходное решение не делает компиляцию кода.
Однако, если я добавлю более сложное обходное решение:
bar buz() {
return const_cast<bar&&>(std::move(foo<bar>()));
}
он компилируется, и весь код работает как ожидалось (не только упрощенный пример выше, но и мой реальный код).
Однако, это безопасно, или я сталкиваюсь с каким-то поведением undefined? Есть ли лучший способ обхода?
Я прочитал и понимаю вопросы о возвращении const
из функций (1, 2), и общий ответ, кажется, заключается в том, что возвращение объектов const
не рекомендуется в современном С++, но мой вопрос не в этом, а о том, как я могу обойти ситуацию, когда внешняя библиотека возвращает объект const
.