如何实现std :: initializer_list?

内容来源于 Stack Overflow,并遵循CC BY-SA 3.0许可协议进行翻译与使用

  • 回答 (1)
  • 关注 (0)
  • 查看 (8)

我一直在看如何initializer_list实现,找到了一个看起来很简单的界面。这将是我自己的版本,我命名MyNamespace::InitializerList和用例:

template<class T>
class ArrayPrinter
{
public:
    ArrayPrinter(MyNamespace::InitializerList<T> list)
    {
        for (auto i : list) cout << i << endl;
    }
};

...

ArrayPrinter ap{ {1,2,3} };

我惊讶地发现这不起作用,编译器说它找不到合适的构造函数

经过一番捣鼓之后,我发现我的class必须正确命名std::initializer_list才能工作。我也可以将std::initializer_list它变成别名,MyNamespace但我无法替代MyNamespace::InitializerListstd::initializer_list

提问于
用户回答回答于

这个名称很重要,因为标准说明了这一点。标准需要某种方式让你能够说,“这个构造函数可以传递一个包含T类型序列值的braced-init-list”。这种方式被命名为“ std::initializer_list”。

你不能创建一个具有所有语言属性的类initializer_list。但是你会注意到那里指定的唯一构造函数是一个默认的构造函数。创建initializer_list具有实际元素的唯一方法依赖于编译器,而不是用户代码。

所以你不能复制initializer_list。就像你无法复制一样std::type_info。C ++标准库不是可选的

扫码关注云+社区