gpt4 book ai didi

c++ - std::initializer_list 的实现

转载 作者:太空狗 更新时间:2023-10-29 20:21:42 25 4
gpt4 key购买 nike

我从头文件 initializer_list 中复制了代码,并将类名重命名为 my_initializer_list

template<class _E>
class my_initializer_list
{
public:
typedef _E value_type;
typedef const _E& reference;
typedef const _E& const_reference;
typedef size_t size_type;
typedef const _E* iterator;
typedef const _E* const_iterator;

private:
iterator _M_array;
size_type _M_len;

// The compiler can call a private constructor.
constexpr my_initializer_list(const_iterator __a, size_type __l)
: _M_array(__a), _M_len(__l) { }

public:
constexpr my_initializer_list() noexcept
: _M_array(0), _M_len(0) { }

// Number of elements.
constexpr size_type
size() const noexcept { return _M_len; }

// First element.
constexpr const_iterator
begin() const noexcept { return _M_array; }

// One past the last element.
constexpr const_iterator
end() const noexcept { return begin() + size(); }
};

和代码:

int main()
{
my_initializer_list<int> foo = {1,2,3};

return 0;
}

得到错误:

could not convert '{1, 2, 3}' from '<brace-enclosed initializer list>' to 'my_initializer_list<int>'

我的问题:STL 如何实现 initializer_list 类?

最佳答案

它适用于 std::initializer_list因为即使 std::initializer_list是一个类,它不是一个常规类。这是一个非常非常特殊的类,在某种意义上,当你写 auto x = {1,2,3};编译器将推断 x成为std::initializer_list<int>并相应地对其进行初始化。编译器在这里使用黑魔法 来执行类型推断和初始化。它只是图书馆的特色。这也是一项核心语言功能。

如果您要使用 my_initializer_list相反,它的构造函数需要接受 std::initializer_list这样编译器就可以为你施展黑魔法。

请注意 {1,2,3}是一个无类型表达式——好吧,迂腐地说,它甚至不是一个表达式;只有在某些特殊情况下,它才能使用一些特殊规则来初始化对象。例如,看这个:

auto items = {1,2,3}; //OK: items is inferred to be std::initializer_list<int>
//must #include <initializer_list>

但是,对于模板,规则是不同的:

 template<typename T>
void f(T const & items);

f({1,2,3}); //ILL-FORMED: T cannot be deduced to be
//std::initializer_list<int> or anything else
//even if you use #include <initializer_list>

f(std::initializer_list<int>{1,2,3}); //OK: #include <initializer_list>

f(std::vector<int>{1,2,3}); //OK: #include <vector>
//because std::vector accepts std::initializer_list<T>

希望对您有所帮助。

关于c++ - std::initializer_list 的实现,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/41887205/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com