我有一个构造函数接受initializer_list作为参数:
A::A(std::initializer_list<uint32_t> arg)
: vec(arg)
{
}
Run Code Online (Sandbox Code Playgroud)
问题是它允许初始化器列表为零或空值为arg:
A {}
Run Code Online (Sandbox Code Playgroud)
如何强制使用非零的initializer_list?
初始化器时{},默认构造函数优先于std::initializer_list构造函数,但后者将在前者不存在时使用.因此,为了强制编译错误,您需要显式删除默认构造函数,以便仍然选择默认构造函数但不能使用:
struct A {
A() = delete;
A(std::initializer_list<uint32_t>) { /* ... */ }
};
Run Code Online (Sandbox Code Playgroud)
但是,在编译时,您无法阻止用户手动构造空std::initializer_list对象并将其传入.在这种情况下,您需要抛出异常来指示构造失败.