必须使用普通旧数据的情况示例?

时间:2012-07-30 12:50:35

标签: c++ pod

  

C ++ 98中的联合不能包含具有虚函数的类   非平凡的构造函数或析构函数。

您知道使用POD的必要条件是什么?

5 个答案:

答案 0 :(得分:2)

解析二进制文件中的一些结构,例如

答案 1 :(得分:2)

语法

X a = {1, 2, 3};

仅适用于POD,尽管在C ++ 11中使用std::initializer_list解除了此限制。

答案 2 :(得分:2)

与非C ++ API(通常是C风格API)交互时。

答案 3 :(得分:2)

需要PODness的一种情况是直接转换为/从字节序列转换。

需要PODness的另一种情况是类型必须保证实例化除了使用一些内存之外没有任何影响,例如:如下面的课程:

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_(); }
};
嗯,我想不出任何第三种情况......

答案 4 :(得分:1)

解析通信协议是另一个。