簡體   English   中英

std :: list <std :: unique_ptr>:空的初始化列表與默認構造函數

[英]std::list<std::unique_ptr>: empty initializer list vs. default constructor

代碼

#include <list>
#include <memory>

class B;
class A {
    std::list<std::unique_ptr<B>> bs;
public:
    A();
    ~A();
};

int main()
{
    A x;
    return 0;
}

顯然編譯。 它沒有鏈接,因為缺少A::A()A::~A() ,但這是預期的並且沒有問題。 更改

std::list<std::unique_ptr<B>> bs;

它應該調用std::list的標准構造函數

list() : list(Allocator()) {}

(C ++ 14及以上)來

std::list<std::unique_ptr<B>> bs{};

應該調用list(std :: initializer_list,const Allocator&= Allocator()); 默認構造函數也是。 (感謝Nicol Bolas ,他正確地提到[over.match.list] 13.3.1.7)在c ++(Ubuntu 5.2.1-22ubuntu2)5.2.1 20151010--std = c ++ 17參數中給出以下錯誤:

/usr/include/c++/5/bits/unique_ptr.h: In instantiation of ‘void std::default_delete<_Tp>::operator()(_Tp*) const [with _Tp = B]’:
/usr/include/c++/5/bits/unique_ptr.h:236:17:   required from ‘std::unique_ptr<_Tp, _Dp>::~unique_ptr() [with _Tp = B; _Dp = std::default_delete<B>]’
/usr/include/c++/5/bits/stl_list.h:106:12:   required from ‘void __gnu_cxx::new_allocator<_Tp>::destroy(_Up*) [with _Up = std::_List_node<std::unique_ptr<B> >; _Tp = std::_List_node<std::unique_ptr<B> >]’
/usr/include/c++/5/bits/list.tcc:75:4:   required from ‘void std::__cxx11::_List_base<_Tp, _Alloc>::_M_clear() [with _Tp = std::unique_ptr<B>; _Alloc = std::allocator<std::unique_ptr<B> >]’
/usr/include/c++/5/bits/stl_list.h:446:17:   required from ‘std::__cxx11::_List_base<_Tp, _Alloc>::~_List_base() [with _Tp = std::unique_ptr<B>; _Alloc = std::allocator<std::unique_ptr<B> >]’
/usr/include/c++/5/bits/stl_list.h:507:11:   required from here
/usr/include/c++/5/bits/unique_ptr.h:74:22: error: invalid application of ‘sizeof’ to incomplete type ‘B’
  static_assert(sizeof(_Tp)>0,
                      ^

關於B類型不完整的吠叫。 我的問題是:

為什么initializer_list構造函數需要一個空的初始化列表的完整類型B

總是贊賞標准的相關部分的指針。

我想你已經走到了前沿

這似乎是CWG(C ++委員會核心工作組)的一個活躍問題。

CWG 1396似乎關注這個問題。 此問題鏈接到CWG 1360 ,其部分內容如下:

類模板加劇了這個問題,因為CWG的當前方向是僅在需要時才實例化成員初始化器(參見問題1396)。

在示例中,初始化器bs從未需要,並且因此通過上面提到的“方向”, 不應該被實例化。 我們今天還不在。 這兩個問題都有地位起草 ,這意味着:他們正在努力。

http://webcompiler.cloudapp.net上報告的FWIW,VS-2015編譯(但當然沒有鏈接)這個例子。

暫無
暫無

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

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