C++ 使用std::copy解决严格的别名问题安全吗?

C++ 使用std::copy解决严格的别名问题安全吗?,c++,reinterpret-cast,strict-aliasing,type-punning,C++,Reinterpret Cast,Strict Aliasing,Type Punning,我有一个函数如下所示: 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)

我有一个函数如下所示:

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));
}
模板
空一些_函数(T*buffer){

BOOST_STATIC_ASSERT(sizeof(T)这段代码看起来像是一场即将发生的灾难。如果出于某种原因它必须存在,那么应该用静态断言和注释填充它,以明确其意图

基本上,只有满足以下条件,它才会起作用:


  • sizeof(T)是
    temporary\u buffer
    实际上是一个
    unsigned int
    ?你真的在从
    unsigned int
    s地址复制
    sizeof(T)
    字节吗?关于
    sizeof(T)有什么保证吗是的,它确实是这样的。在函数的开头有一个静态断言,它确保
    sizeof(T)哎呀,完全错过了断言。所有这些条件都成立(并在实际代码中强制执行)。这就是为丑陋的C API编写包装时的样子。