最近我读到这样一段代码:这个“新”语法是什么意思?
template <unsigned long size>
class FooBase
{
bool m_bValid;
char m_data[size];
};
template <class T>
class Foo : public FooBase<sizeof(T)>
{
// it's constructor
Foo(){};
Foo(T const & t) {construct(t); m_bValid = (true);}
T const * const GetT() const { return reinterpret_cast<T const * const>(m_data); }
T * const GetT() { return reinterpret_cast<T * const>(m_data);}
// could anyone help me understand this line??
void construct(T const & t) {new (GetT()) T(t);}
};
我已经切片的代码,以确保它并不复杂,主要的问题是关于construct(T const & t)
功能。
new (GetT()) T(t);
究竟是什么意思?
btw,哪个版本的GetT()
被调用?
这是值得注意的是,这个代码是非常脆弱的......如果'm_data'成员没有一个'T'对象对齐适当您的特定CPU /内存架构,那么程序可能会崩溃。对齐/打包是一个实现细节(即没有被标准规定)。特定的编译器通常会提供编译/扩展来控制打包。这个代码可以通过在'm_bValid'之前将'm_data [size]'成员移动到FooBase的前面来解决。 –
@TonyD代码被切片,正如我所说:)实际上它来自“游戏编码完成”2006年版,第3章第5节'optional.h'。感谢编译器问题,当我使用这个类时,我会关注它。 – shengy
您的'Foo <> :: GetT'函数非常危险,因为'reinterpret__cast'! – PiotrNycz