C++98 中的联合不能包含具有虚函数或非平凡构造函数或析构函数的类。
您知道哪些情况下必须使用POD?
与非 C++ API(通常是 C 风格的 API)交互时。
需要 POD 的一种情况是直接转换到/从字节序列。
需要 POD 的另一种情况是类型必须保证实例化除了使用一点内存之外没有任何影响,例如在以下类中:
namespace detail {
using std::vector;
template< class Type, Podness::Enum podNess = Podness::isPod >
class ValueWrapper_
{
private:
Type v_;
public:
Type const& ref() const { return v_; }
ValueWrapper_() {} // No initialization
ValueWrapper_( Type const v ): v_( v ) {}
};
template< class Type >
struct ValueWrapper_< Type, Podness::isNotPod >
{
private:
vector<Type> v_; // General but incurs allocation overhead.
public:
Type const& ref() const { return v_[0]; }
ValueWrapper_() {} // Supports apparent no initialization.
ValueWrapper_( Type const v ): v_( 1, v ) {}
};
} // namespace detail
template< class Type >
class Optional_
{
private:
typedef detail::ValueWrapper_<Type, Podness_<Type>::value > Wrapper;
Wrapper const value_;
bool const isNone_;
Optional_& operator=( Optional_ const& ); // No such.
public:
bool isNone() const { return isNone_; }
Type const& value() const
{
hopefully( !isNone_ )
|| throwX( "Optional_::value(): there is no value" );
return value_.ref();
}
Optional_(): isNone_( true ) {}
Optional_( Type const& v ): value_( v ), isNone_( false ) {}
static Optional_ none() { return Optional_(); }
};
template<>
class Optional_< void >
{
private:
Optional_& operator=( Optional_ const& ); // No such.
public:
bool isNone() const { return true; }
void value() const
{
throwX( "Optional_::value(): there is no value" );
}
Optional_() {}
static Optional_ none() { return Optional_(); }
};
嗯,想不到第三种情况……
语法
X a = {1, 2, 3};
std::initializer_list
仅适用于 POD,尽管在 C++11中取消了此限制。
解析二进制文件中的一些结构,例如
解析通信协议是另一回事。