13

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

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

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

4

1 回答 1

11

两个独立的构造函数的原因是允许构造以 ainitializer_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);

您将无法构建optionalas

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

上面的失败是因为花括号初始化列表没有类型,所以模板参数推导失败。你必须诉诸这样的事情:

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

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

这是一个演示这两个构造函数的实用性的最小示例。

于 2014-12-03T04:18:42.013 回答