【问题标题】:Is this struct POD in C++11?这是 C++11 中的 struct POD 吗?
【发布时间】:2011-11-02 10:27:44
【问题描述】:

这个结构是 C++11 中的 POD 吗?

struct B
{
  int a;
  B(int aa) : a(aa) {}
  B() = default;
};

请注意,这个问题是关于 C++11 的。我知道这个类不是 C++98 和 C++03 中的 POD。

有关 C++11 中 POD 的解释,请参阅trivial vs. standard layout vs. POD

(受此问题启发:Is there a compile-time func/macro to determine if a C++0x struct is POD?

【问题讨论】:

  • ...你指的是什么类?
  • 老实说,如果您看到有关std::is_pod 的问题,您为什么不向编译器提出这个问题
  • @R. Martinho Fernandes VS2010 不接受“=default”,Comeau 在线编译器也不接受。

标签: c++ c++11


【解决方案1】:

是的,根据new rules,它是一个POD。

如果您查看新标准的第 8.4.2/4 段,您可以看到如果构造函数在第一个声明中被默认,则它不是用户提供的:

显式默认函数和隐式声明函数是 统称为 defaulted 函数,其实现应 为它们提供隐式定义(§12.1 §12.4, §12.8),这可能 意味着将它们定义为已删除。一个特殊的成员函数是 user-provided 如果它是用户声明的并且没有明确默认或 在第一次声明中删除。 (...)

您可以使用std::is_pod 类型特征来为您提供test thisstatic_assert 的编译器。

static_assert(std::is_pod<B>::value, "B should be a POD");

【讨论】:

  • 我还不相信编译器能做到这一点。事实上,我什至找不到一个编译器可以编译我的代码而不阻塞= default 部分!
  • GCC 4.5 支持这一点,这就是 ideone.com 背后的内容。有时我忘记了并非所有其他编译器都对 C++11 特性的支持水平相同:(
  • 感谢您的报价,这是我缺少的链接。如果默认构造函数是用户提供的,那么它就不是微不足道的,而且您的引用清楚地表明B() = default; 不算是用户提供的。
  • @Sjoerd:不要忘记= default 必须出现在第一个声明中(将在类中)。如果你在课堂上声明B();,然后再做B::B() = default;,这不是微不足道的。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2018-04-01
  • 2012-08-27
  • 2012-08-27
  • 2012-05-22
  • 2016-01-13
  • 2021-09-21
  • 2019-08-09
相关资源
最近更新 更多