【发布时间】:2013-11-07 21:13:50
【问题描述】:
拥有一个聚合公共基类(或什至多个聚合公共基类)会使一个类失去聚合类的优良属性是什么?
“聚合基类”的定义来自 http://en.cppreference.com/w/cpp/language/aggregate_initialization http://en.wikipedia.org/wiki/C++_classes#Aggregate_classes
聚合类的优点:
- 在不定义构造函数的情况下,可以通过传入用大括号括起来的值列表来初始化聚合类型,以初始化其成员(或基类,如果它们允许的话)。
- 聚合类型被认为是“简单的”(PODs 的泛化),并且可以用作
constexprs 的文字类型。
来自http://en.cppreference.com/w/cpp/language/aggregate_initialization#Example的初始化示例:
#include <string>
#include <array>
struct S {
int x;
struct Foo {
int i;
int j;
int a[3];
} b;
};
int main()
{
S s1 = { 1, { 2, 3, {4, 5, 6} } };
S s2 = { 1, 2, 3, 4, 5, 6}; // same, but with brace elision
}
另请参阅: What are Aggregates and PODs and how/why are they special?
【问题讨论】:
-
我猜这是因为您无法使用初始化列表初始化此类聚合的成员。
-
您特别关注哪些“好属性”?列出它们,举例说明它们应该如何处理空基类和非空基类以及虚拟继承,当你完成这些工作时,你就会得到答案。或者一个更好的问题。
-
所以现在看来你所说的所有它真正获得的好处是你必须少写一个构造函数,一个可能只有一行的构造函数
-
聚合类型可用作文字类型 (en.cppreference.com/w/cpp/concept/LiteralType),而后者又可用于 constexpr 参数和返回值 (en.cppreference.com/w/cpp/language/constexpr)。 constexpr 函数可用于生成编译时常量。但就这个问题而言,我想要它真的很重要吗?
-
@leewangzhong 我喜欢 constexpr 的东西,虽然我想我已经使用它而不考虑它,请记住 constexprs 在 c++14 中将更加通用