MSVC12认为从std :: array派生的聚合不是pod

时间:2014-01-07 09:37:09

标签: c++ visual-c++ pod static-assert

鉴于以下内容

#include <array>

struct litmus final : std::array<unsigned char, 16>
{
};

static_assert(std::is_pod<std::array<unsigned char, 16> >::value, "not pod");

// this fails on MSVC:
static_assert(std::is_pod<litmus>::value, "not pod");

以下编制者同意litmus是pod:

但是,MSVC12(VS2013 RTM)认为第二个断言失败。

  1. 谁是对的?
  2. 是否有任何技巧可以让MSVC将该类视为pod?
  3.   

    编辑有关信息:is_trivially_copyable<litmus>在MSVC上返回true-ness。对于许多不严格要求实际POD的情况,这可能很有用。

1 个答案:

答案 0 :(得分:8)

  1. GCC和Clang;该课程是POD。

  2. 这取决于完全你的意思是“make MSVC将该类视为pod”。如果你的意思是编译器内部,那么没有。但是,您可以(在实践中)专门研究litmus

    的特征
    namespace std {
    
    template <>
    struct is_pod<litmus> : std::true_type
    {};
    
    }
    

    请注意,严格遵循标准,这会给出未定义的行为(感谢@ R.MartinhoFernandes指出这一点)。但是,作为特定于编译器的解决方法,我希望它能够正常工作。使用不受任何保证。