【发布时间】:2014-01-11 09:06:34
【问题描述】:
所以如果我这样做:
#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;
}
注意:“m_data”和“this”应该指向同一个地方...
gcc 4.8.1
【问题讨论】:
-
我想说编译器不够聪明,无法弄清楚(出于某种原因)。我认为这确实不合法。
-
为什么要使用 C 风格的类型转换?
-
@Constructor 与函数样式转换或 std::static_cast 或?你在说什么?
-
@Mike 我说的是
(V&&)v...和(T*)m_data。 -
@Mike "and static_cast 只是一个 c 风格的演员" -- 那部分是不对的。
标签: c++ templates pointers c++11 strict-aliasing