簡體   English   中英

動態對象的統一初始化

[英]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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM