2014-03-04 46 views
2

這是一個g ++的bug嗎?繼承構造函數不允許類似數組的初始化

#include <array> 

struct inherit : std::array<int , 3>{ 
    using std::array<int , 3>::array; 
}; 

std::array<int, 3> ok1 = {1,2,3}; 
inherit ok2; 
inherit bad = {1,2,3}; 

實例化bad,我得到error: could not convert ‘{1, 2, 3}’ from ‘<brace-enclosed initializer list>’ to ‘inherit’。我看起來絕對正確。

+3

'std :: array'具有隱式聲明的構造函數。所以構建使用聚合初始化。聚合不能有基類,所以'inherit'不是聚合,因此不能使用聚合初始化。 – 2014-03-04 02:42:31

+1

有一個鏈接在談論聚合初始化。 http://en.cppreference.com/w/cpp/language/aggregate_initialization – yinqiwen

回答

3

std::array是一個聚集。它沒有用戶定義的構造函數。

從C++標準

1所述的骨料是沒有用戶提供的 構造(12.1),無私有或保護的非靜態數據成員 (第一個數組或一個類(第9節) 11),沒有基類(第10章),沒有虛函數 (10.3)。

類繼承不是聚合,因爲它有一個基類。所以它可能不會使用大括號初始化(除了一個空的初始化程序列表)。如果要使用非空初始化程序列表初始化它,則應該明確定義類繼承的構造函數,