c++ - 带有 initializer_list 的可选构造函数

标签 c++ c++14 option-type c++17

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

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++技术规范的标签

最佳答案

两个独立的构造函数的原因是允许构造以 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演示这两个构造函数的实用性。

关于c++ - 带有 initializer_list 的可选构造函数,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/27263365/

相关文章:

c++ - 使用 boost::optional 捕获和包装异常

c++ - 在 QML 文件之间共享一个对象

c++ - 将项目移动到 Visual Studio 2012

c++ - std::unique_ptr 的非所有权拷贝

c++ - 具有可变数量参数的函数成员的容器

swift - 在 Swift 中调用具有可选类型的函数

c++ - 在 linux 中使用为 windows 编写的软件库(使用 dll)

c++ - 如何将参数循环到具有相同名称的多个结构?

c++ - 如何在 C++14 中编写通用转发 lambda?

json - 忽略不支持的解码器