初始化程序列表的构造和静态断言

时间:2018-10-08 08:34:23

标签: 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<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;
    }
};

除了static_assert之外,一切都在这里工作正常。我在哪里:

  

错误:静态声明的非恒定条件

     

错误:“列表”不是常量表达式

这听起来像是this guy遇到的同一问题。

其中一种建议的解决方案建议将其作为答案:

template<size_t N>
Queue(const value_type(&list)[N] ) :
    m_last_write(0)
{
    static_assert( N <= Size , "Too big!" );

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

但是,当我使用此初始化程序列表时:

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

我收到此错误:

  

错误:无法将<{66,55,44}'从<大括号括起来的初始化程序列表>转换为Queue

1 个答案:

答案 0 :(得分:1)

您发布的解决方案的问题是,在list initialization(即Queue<int,10> r = {66,55,44};)中,Queue的构造函数被认为具有重载分辨率以匹配三个参数665544,则匹配失败。

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

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