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


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

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

请注意,这个问题是明确的 C ++ 11。我知道这个类不是C ++ 98中的POD,也不是C ++ 03。

有关C ++ 11中POD的说明,请参阅 平凡与标准布局与POD

(灵感来自这个问题: 是否有编译时func /宏来确定C ++ 0x结构是否为POD? )


7720
2017-08-24 02:01


起源

你指的是什么课? - Nicol Bolas
老实说,如果你看到了这个问题 std::is_pod, 你为什么不问这个编译器呢?? - R. Martinho Fernandes
@R。 Martinho Fernandes VS2010不接受“=默认”,也没有接受Comeau在线编译器。 - Sjoerd


答案:


是的,这是一个POD根据 新规则

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

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

你可以使用 std::is_pod 类型trait有编译器 测试一下 适合你 static_assert

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

14
2017-08-24 02:04



我不相信编译器能够做到这一点。事实上,我甚至找不到一个编译器来编译我的代码而不会窒息 = default 部分! - Sjoerd
GCC 4.5支持这一点,这就是ideone.com背后的运行方式。有时我会忘记并非所有其他编译器都支持C ++ 11的功能:( - R. Martinho Fernandes
谢谢你的报价,这是我缺少的链接。如果是用户提供的,默认构造函数并不简单,并且您的引用清楚地表明了 B() = default; 不算作用户提供的。 - Sjoerd
@Sjoerd:别忘了 = default 必须出现在第一个声明(它将在类中)。如果你申报的话,这不是一件轻而易举的事 B(); 在课堂上再做 B::B() = default;。 - R. Martinho Fernandes
关于ideone.com的信息+1 :-) - Cheers and hth. - Alf