簡體   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