[英]uniform initialization for dynamic objects
#include <memory>
struct foo
{
std::unique_ptr<int> p;
};
int main()
{
foo bar { std::unique_ptr<int>(new int(42)) };
// okay
new foo { std::unique_ptr<int>(new int(42)) };
// error: no matching function for call to
// 'foo::foo(<brace-enclosed initializer list>)'
}
統一初始化不適用於動態對象,還是g ++ 4.6.1的缺點?
它適用於g ++ 4.7.1,但如果foo
從另一個類繼承,則main
兩行都無法編譯:
struct baz
{
// no data members, just some member functions
};
struct foo : baz
{
std::unique_ptr<int> p;
};
再次,我的編譯器的缺點? 或者統一初始化不能很好地繼承?
它用g ++ - 4.7構建得很好。 所以可能是后者。 我將看看是否可以通過文檔找到更有力的證據。
並回應繼承附錄:
這個更簡單的情況也無法編譯:
struct baz
{
};
struct foo : baz
{
int b;
};
int main()
{
foo bar { 12 };
}
附:
testoo.cpp:14:18: error: no matching function for call to ‘foo::foo(<brace-enclosed initializer list>)’
testoo.cpp:14:18: note: candidates are:
testoo.cpp:7:8: note: foo::foo()
testoo.cpp:7:8: note: candidate expects 0 arguments, 1 provided
testoo.cpp:7:8: note: constexpr foo::foo(const foo&)
testoo.cpp:7:8: note: no known conversion for argument 1 from ‘int’ to ‘const foo&’
testoo.cpp:7:8: note: constexpr foo::foo(foo&&)
testoo.cpp:7:8: note: no known conversion for argument 1 from ‘int’ to ‘foo&&’
根據我對標准的閱讀,你在第一個例子中得到了aggregate initialization
:
聚合是一個數組或類(第9節),沒有用戶提供的構造函數(12.1),非靜態數據成員(9.2)沒有大括號或相等的初始值,沒有私有或受保護的非靜態數據成員(第11條),沒有基類(第10條),沒有虛函數(10.3)。
當初始化程序列表初始化聚合時,如8.5.4中所述,初始化程序列表的元素將作為聚合成員的初始化程序,增加下標或成員順序。
請注意,這明確禁止基類。 總而言之 - 在基類存在的情況下不允許聚合初始化。 因此,第二個例子都不會編譯。
如果
foo
從另一個類繼承,則main
兩行都無法編譯
啊,統一初始化對聚合和非聚合的工作方式不同:
列表初始化對象或類型T的引用定義如下:
- 如果T是聚合,則執行聚合初始化
- [...]
- 否則,如果T是類類型,則考慮構造函數
聚合是[..]一個沒有基類[...]且沒有虛函數的類[...]。
所以我仍然需要在我的情況下編寫自定義構造函數,因為我需要這里的子類型多態性。
我目前還沒有最終版本,但草案N3242,§8.5.4 § 8.5.4 List-initialization
明確指出列表初始化可以用作新表達式中的初始化程序。 它還提供了以下示例:
new std::vector<std::string>{"once", "upon", "a", "time"}; // 4 string elements
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.