[英]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 };
如果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>
。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.