繁体   English   中英

聚合初始化派生类

[英]Aggregate initialization of a derived class

以下代码无法使用Visual Studio2017或在线GDB进行编译。 我期望它编译,因为迭代器只是一个类型的类,它是公开继承的。 这是不允许的还是在VS2017中不起作用?

template<typename T>
struct Gen : public std::iterator<std::input_iterator_tag, T>
{
    T value;
};

int main()
{   
    Gen<int> g = Gen<int>{ 10 }; // this doesnt
    Gen<int> g2 = Gen<int>{ {}, 10 }; // neither does this
}

错误是

错误C2440'初始化':无法从'初始化列表'转换为'Gen'

什么

Gen<int> g = Gen<int>{ 10 };

尝试做的是调用不存在的Gen<int>(int)构造函数。 你想要做的是聚合初始化,其语法是:

Gen<int> g = { {}, 10 };

仅适用于派生类型的C ++ 17

如果initializer子句是嵌套的braced-init-list(不是表达式),则从该子句对列表初始化相应的数组元素/类成员/公共库(自C ++ 17开始) :聚合初始化是递归的。


有关更多信息, 聚合初始化在以下标准部分中定义。

[dcl.init.list]/3

  1. 列表初始化对象或类型T的引用定义如下:
    3.1如果braced-init-list包含指定的初始化列表 ,则T应为聚合类。

[dcl.init.aggr]/1

聚合是一个数组或类(第12条)
1.1没有用户提供的,显式的或继承的构造函数(15.1),
1.2没有私人或受保护的非静态数据成员(第14条),
1.3没有虚函数(13.3),和
1.4没有虚拟,私有或受保护的基类(13.1)。

因为继承自std::iterator<std::input_iterator_tag, T>

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM