Reinterpret_cast для диапазона обертокC++

Программы на C++. Форум разработчиков
Ответить
Anonymous
 Reinterpret_cast для диапазона оберток

Сообщение Anonymous »

Учитывая следующую обертку (упрощенно):
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
Ответить

Быстрый ответ

Изменение регистра текста: 
Смайлики
:) :( :oops: :roll: :wink: :muza: :clever: :sorry: :angel: :read: *x)
Ещё смайлики…
   
К этому ответу прикреплено по крайней мере одно вложение.

Если вы не хотите добавлять вложения, оставьте поля пустыми.

Максимально разрешённый размер вложения: 15 МБ.

Вернуться в «C++»