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

seh*_*ehe 8 c++ static-assert pod visual-c++

鉴于以下内容

#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");
Run Code Online (Sandbox Code Playgroud)

以下编译器同意litmuspod:

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

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

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

Rei*_*ica 8

  1. GCC和Clang; 那个班是POD.

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

    namespace std {
    
    template <>
    struct is_pod<litmus> : std::true_type
    {};
    
    }
    
    Run Code Online (Sandbox Code Playgroud)

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

  • 要严格正确:**不,你不能**专门为它做特质.使`std :: is_pod`不仅仅是作为一个特征,而是*明确禁止*.但是,这是一个特定于编译器的解决方法,它很好. (4认同)
  • 我会说正确的解决方法是你自己的`is_trivially_copyable`,它默认为`std :: is_trivially_copyable`,但对于你知道错误的情况有模板特化. (2认同)