这里我有一个接受std::vector<>
或std::initializer_list
的构造函数,但它不接受初始化列表。已注释掉的ctor将接受初始化列表但不接受std::vector<>
或std::initializer_list
。
class C
{
std::vector<int> values;
public:
template <class Container> explicit C(const Container& container)
{
values = std::vector<int>(container);
}
// explicit C(const std::initializer_list<int>& initializer_ist)
//{
// values = std::vector<int>(initializer_ist);
//}
};
std::vector<int> v{1, 2, 3};
C c_from_vector(v); // OK
auto initializer_list = {1, 2, 3};
C c_from_initializer_list(initializer_list); // OK
C c_from_initializer_list2({1, 2, 3}); // ERROR
我可以编写一个适用于所有3个调用的构造函数吗?
答案 0 :(得分:2)
您需要两个构造函数,因为您无法推断出像{1, 2, 3}
这样的 braced-init-list - 必须与特定类型匹配或initializer_list<T>
(其中{推断出{1}}。但请确保使用 mem-initializer ,而不是仅仅在正文中进行分配。
这应该适用于所有情况:
T
可能不需要制作第二个template <typename... Args,
std::enable_if_t<std::is_constructible<std::vector<int>, Args&&...>::value, int> = 0>
explicit C(Args&&... args)
: values(std::forward<Args>(args)...)
{ }
C(std::initializer_list<int> lst)
: values(lst)
{ }
。另请注意,explicit
之前没有理由选择initializer_list
。价值很好。