【问题标题】:MSVC12 thinks aggregate derived from std::array is not podMSVC12 认为从 std::array 派生的聚合不是 pod
【发布时间】:2014-01-07 09:37:09
【问题描述】:

鉴于以下

#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&lt;litmus&gt; 在 MSVC 上返回真实性。这对于许多不严格要求实际 POD 的情况可能很有用。

【问题讨论】:

  • FWIW 我查看了标准第 9 节中 standard-layout classPOD struct 的规范,我同意 litmus 应该成为一个 POD。但是无法提供解决方法。
  • 甚至不知道你可以这样使用'final',谢谢!
  • 你可以专门化 std::is_podlitmus 以返回 true,假设你的用例实际上和这个例子一样简单。

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


【解决方案1】:
  1. GCC 和 Clang;该类是 POD。

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

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

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

【讨论】:

  • 完全正确:不,你不能专门针对它的特征。让std::is_pod 撒谎不仅不是一个功能,而且是明确禁止。但是,这是一个特定于编译器的解决方法,还不错。
  • @R.MartinhoFernandes 谢谢,已修改。我不知道特征类型专业化是明确禁止的。不过,这确实是有道理的。
  • @Angew 对我来说,这关乎安全。我不介意断言是否需要评论。我只需要知道该类是按位可复制的。如果编译器的 is_pod 特征没有告诉我它是安全的,我怎么知道是这种情况?
  • @sehe:如果您想知道它是否可以轻松复制,请使用is_trivially_copyable 而不是is_pod。 (假设你的编译器做对了)。
  • 我想说正确的解决方法是您自己的is_trivially_copyable,默认为std::is_trivially_copyable,但在您知道错误的情况下使用模板专业化。
猜你喜欢
  • 1970-01-01
  • 2019-09-04
  • 2014-03-12
  • 2015-04-16
  • 2015-12-14
  • 1970-01-01
  • 2011-05-15
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多