带有initializer_list的可选构造函数

问题描述 投票:13回答:1

这个特殊构造函数采用初始化列表的目的是什么。有人可以举例说明什么时候有用吗?

template <class U, class... Args>
constexpr explicit optional(in_place_t, initializer_list<U> il, Args&&... args);

以上与此有何不同?

template <class... Args> 
constexpr explicit optional(in_place_t, Args&&... args); 

参考:http://www.open-std.org/jtc1/sc22/wg21/docs/papers/2013/n3793.html#optional.object.ctor

附:不确定是使用c ++ 14还是c ++ 1z标记。我认为应该有c ++技术规范的标签

c++ c++14 optional c++17
1个回答
10
投票

两个独立构造函数的原因是允许构造以initializer_list作为构造函数参数的对象(可选地后跟任意参数列表)。假设您有类型foo,如下所示:

struct foo
{
    foo(std::initializer_list<int>) {}
};

在没有构造函数的情况下

template <class U, class... Args>
constexpr explicit optional(in_place_t, initializer_list<U> il, Args&&... args);

你将无法构建一个optional

optional<foo> o(in_place, {1, 2, 3});

上述操作失败,因为braced-init-list没有类型,因此模板参数推断失败。你不得不求助于这样的事情:

auto il = {1, 2, 3};
optional<foo> o(in_place, il);

拥有接受initializer_list参数的构造函数允许在构造optional对象时使用更自然的语法。

这是一个minimal example,展示了两个构造函数的实用性。

© www.soinside.com 2019 - 2024. All rights reserved.