C++ 初始值设定项列表构造和静态断言

C++ 初始值设定项列表构造和静态断言,c++,initializer-list,C++,Initializer List,我试图让我的类支持初始值设定项列表 #include <array> #include <initializer_list> template <class value_type, size_t Size> class Queue { std::array<value_type,Size> m_data; size_t m_last_write; public: Queue(std::initializer_list&l

我试图让我的类支持初始值设定项列表

#include <array>
#include <initializer_list>

template <class value_type, size_t Size>
class Queue {
    std::array<value_type,Size> m_data;
    size_t m_last_write;

public:
    Queue(std::initializer_list<value_type> list) :
        m_last_write(0)
    {
        static_assert( list.size() <= Size, "Initializer list length is longer than Queue has been configured for");

        for (auto& datum : list)
            push(datum);
    }

    void push(const value_type& val)
    {
        if (++m_last_write >= Size);
            m_last_write -= Size;

        m_data[ next_i ] = val;
    }
};
但是,当我使用此初始值设定项列表时:

Queue<int,10> r = {66,55,44};
队列r={66,55,44};
我得到这个错误:

错误:无法将“{66,55,44}”从转换为队列


您发布的解决方案的问题是,在队列中,即
队列r={66,55,44}队列
的构造函数,以匹配三个参数
66
55
44
,然后匹配失败

您可以再添加两个大括号作为解决方法,然后参数
{66,55,44}
将用作一个参数来匹配构造函数的参数;然后,它匹配接受数组并按预期工作的

Queue<int,10> r = {{66,55,44}};
队列r={{66,55,44};

您不能将
静态断言
用于仅在运行时已知的内容。我给出的最后一个例子(它避免了std::initializer_list)应该在编译时推导出来。参数不是
constexpr
,我们无法从类型
std::initializer\u list
中知道大小。也许我混淆了
括号内的initializer list
std::initializer\u list
。我知道
std::initializer\u list::size
不是
constepr
,所以我可能试图使用
括号内的initializer list
,就好像它是一个
std::initializer\u list
一样,即使它们是完全独立的。请注意,
std::initializer\u list::size
constepr
,因为c++14。
Queue<int,10> r = {{66,55,44}};