代码
#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&amp; = 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
作为空的初始化列表?
总是赞赏标准相关部分的指示。
答案 0 :(得分:2)
我认为您已踏上bleeding edge。
这似乎是CWG(C ++委员会核心工作组)的一个活跃问题。
CWG 1396似乎关注这个问题。此问题链接到CWG 1360部分说明:
当前,类模板使问题更加严重 CWG的方向是仅在它们时实例化成员初始化器 需要(见问题1396)。
在您的示例中,bs
的初始值设定项从不,因此需要&#34;方向&#34;如上所述,应该永远不会被实例化。我们今天还没有。这两个问题都具有起草的状态,这意味着:他们正在研究它。
在http://webcompiler.cloudapp.net报告的FWIW,VS-2015编译(但当然没有链接)这个例子。