模板化类构造函数中的static_assert



我正在尝试创建一个由std::initializer_list初始化的示例数组类。我想在编译时检查初始化器列表的大小是否不大于数组的大小。由于静态断言只能计算constexpr,因此不会编译此代码。

#include<initializer_list>
#include<cstddef>
template <typename T , size_t _size>
class array
{
private:
T arr[_size];
public:
array()
{
}
array(std::initializer_list<T> arrList)
{
static_assert(_size>arrList.size(),"too many initializers"); // error: non-constant condition for static assertion
}
~array()
{
}
};
int main()
{
array<int,4> arr = {1,2,3,4,5}; 

return 0;
}

std::array已经有了这个功能,但是我在头文件中找不到它的实现。

#include<array>
int main()
{
std::array<int,5> arr= {1,2,3,4,5,6}; // error: too many initializers for ‘std::array<int, 5>’
return 0;

}

不能使用std::initializer_listarrList.size()不能在常量表达式中使用,尽管其size()成员函数声明为constexpr。看看这个问题。

std::array使用聚合初始化,它没有采用std::initializer_list的构造函数。std::array通常就是这样实现的:

template<typename T, std::size_t size>
struct array {
T arr[size];
/* member functions */
};

或者(调用构造函数的语法略有不同(,您可以创建一个通过引用获取数组的构造函数:

template<typename T, std::size_t size>
class array {
public:
template<std::size_t s>
array(const T(& a)[s]) {
static_assert(s <= size, "too many initializers");
}
private:
T arr[size];
};

然后

array<int, 4> arr({1, 2, 3, 4, 5}); // error: static_assert failed due to requirement
// '5UL <= 4UL' "too many initializers"

由于static_assert,将无法编译。但是,您需要在array构造函数中使用一些技巧来执行arr数据成员的实际初始化(不能执行arr(a)(。

最新更新