Ser*_*sen 7 c++ initialization
以下代码无法使用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
}
Run Code Online (Sandbox Code Playgroud)
错误是
错误C2440'初始化':无法从'初始化列表'转换为'Gen'
YSC*_*YSC 10
什么
Gen<int> g = Gen<int>{ 10 };
Run Code Online (Sandbox Code Playgroud)
尝试做的是调用不存在的Gen<int>(int)构造函数.你想要做的是聚合初始化,其语法是:
Gen<int> g = { {}, 10 };
Run Code Online (Sandbox Code Playgroud)
而且因为C++ 17只适用于派生类型:
如果initializer子句是嵌套的braced-init-list(不是表达式),则从该子句对列表初始化相应的数组元素/类成员/公共库(自C++ 17开始):聚合初始化是递归的.
有关更多信息,聚合初始化在以下标准部分中定义.
[dcl.init.list]/3
- 类型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>.
| 归档时间: |
|
| 查看次数: |
532 次 |
| 最近记录: |