У меня есть функция, которая выглядит следующим образом:Использует std :: copy, чтобы работать со строгим безопасным псевдонимом?
template<typename T>
void some_function(T* buffer) {
BOOST_STATIC_ASSERT(sizeof(T) <= sizeof(unsigned int));
unsigned int temporary_buffer;
int result = some_c_api(&temporary_buffer);
if(result == error)
throw some_exception();
// originally *buffer = reinterpret_cast<T&>(temporary_buffer), but this breaks
// strict aliasing
std::copy(reinterpret_cast<char*>(&temporary_buffer),
reinterpret_cast<char*>(&temporary_buffer) + sizeof(T),
reinterpret_cast<char*>(buffer));
}
Безопасно отбрасывать как несвязанные буферы char*
здесь и скопировать число байт целевой буфер может содержать? Я использую компилятор не-C++ 11 (gcc 4.1.2).
Я столкнулся с этим при реорганизации кода. Исходный код не имел этого предупреждения, потому что он проходил вокруг буферов как void*
. Правильно ли я предполагаю, что это было незаконно?
Действительно ли 'временный_баффер'' 'неподписанный int'? И действительно ли вы копируете 'sizeof (T)' байты из этого 'unsigned int's address? Существуют ли какие-либо гарантии относительно 'sizeof (T) <= sizeof (unsigned int)'? – Angew
Да, это действительно так. В начале функции есть статическое утверждение, которое обеспечивает 'sizeof (T) <= sizeof (unsigned int)'. –
Упс, пропустил утверждение полностью. – Angew