将"this"指针强制转换为另一种类型并不违反严格的别名?

Mik*_*ike 5 c++ templates pointers strict-aliasing c++11

所以,如果我做这样的事情:

#include <ios>

using std::forward;

template<class T>
struct pod_version final{
    private:
        alignas(T) uint8_t m_data[sizeof(T)];
    public:
        pod_version()=default;
        pod_version(const pod_version&)=default;
        pod_version(pod_version&&)=default;
        ~pod_version()=default;
        pod_version& operator=(const pod_version&)=default;
        pod_version& operator=(pod_version&&)=default;

        template<class...V>void construct(V&&...v){
            new (m_data) T(forward<V>(v)...);
        }

        void destroy(){
            reinterpret_cast<T*>(m_data)->~T(); // g++: warning typed punned blah im allowed to break ur code LOL
            reinterpret_cast<T*>(this)->~T(); // g++: :D
        }
};

int main(){
    pod_version<int> x;
    x.construct(5);
    x.destroy();
    return 0;
}
Run Code Online (Sandbox Code Playgroud)

注意:"m_data"和"this"应该指向同一个地方......

gcc 4.8.1

Ben*_*igt 1

使用char,不使用uint8_t

类型双关规则对于charsigned char、 和unsigned char以及 ONLY 这些类型有特殊情况。 uint8_t不需要表示其中之一。

请注意,这个类的整个概念pod_version是可疑的。您在无效的类型上强制执行简单的复制语义。您的代码将尝试在未初始化的内存或对象的二进制映像上调用析构函数。两者都会导致未定义的行为。