template class Wrapper {
public: auto val() { return t; }
private: T t;
};
Я пытаюсь получить диапазон оберток для контейнера обернутых типов, например:
template
auto suspect(auto& ar) {
return std::span(reinterpret_cast(ar.data()), ar.size());
}
используется следующим образом:
auto ar = external_func_returning_array_or_vector();
auto sp = suspect(ar);
external_func_accepting_span_of_wrappers(sp);
Насколько я понимаю, поскольку стандартный макет Wrapper позволяет привести указатель на него к указателю на его обернутый элемент.
Однако я сильно подозреваю, что шаблон подозреваемого() в том виде, в каком он написан, вызывает неопределенное поведение, главным образом потому, что в нем нет реальных объектов-оболочек.
Мои вопросы:
- Прав ли я, полагая что подозреваемый() вызывает UB?
- Если да, то есть ли способ переписать его, не вызывая UB и не копируя потенциально большой контейнер (с использованием функций C++20 или C++23)?
- Если невозможно сделать это переносимым способом, можно ли есть ли какой-нибудь специфический для Clang способ сделать это?
Новое место размещения лучше? Или это все-таки УБ?
template
auto suspect(auto& ar) {
return std::span(new(ar.data()) Wrapper[ar.size()], ar.size());
}
Подробнее здесь: https://stackoverflow.com/questions/791 ... f-wrappers
Мобильная версия