8

鉴于以下

#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?

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

4

1 回答 1

8
  1. GCC 和 Clang;该类是POD。

  2. 这取决于您对“使 MSVC 将类视为 pod”的确切含义。如果您的意思是编译器内部,那么没有。但是,您可以(在实践中)将特征专门用于litmus

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

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

于 2014-01-07T09:54:49.750 回答