std::数组实现上的隐式构造函数出现奇怪错误
Weird error for implicit constructor on std::array implementation
#include "array.hpp"
int main() {
constexpr array<int, 5> a1 = { { 2, 4, 6, 8 } };
}
这是我的代码^
我搜索了一下,据说隐式构造函数可以这样做{ { blah, blah, blah } }
,但仍然不起作用。我也只是做了一个统一的大括号初始化语法(a1 = { 2, 4, 6, 8 }
(,但没有成功。
错误:
main.cpp: In function ‘int main()’:
main.cpp:5:57: error: could not convert ‘{{2, 4, 6, 8}}’ from ‘<brace-enclosed initializer list>’ to ‘const xstl::array<int, 5>’
5 | constexpr xstl::array<int, 5> a1 = { { 2, 4, 6, 8 } };
| ^
| |
| <brace-enclosed initializer list>
main.cpp:6:57: error: could not convert ‘{{1, 3, 5, 7}}’ from ‘<brace-enclosed initializer list>’ to ‘const xstl::array<int, 5>’
6 | constexpr xstl::array<int, 5> a2 = { { 1, 3, 5, 7 } };
| ^
| |
| <brace-enclosed initializer list>
我不理解这个错误,因为构造函数是隐式的?
为什么这个聚合出错?为什么std::array
实现有效,而此实现无效?
以下是实现,不太多:
#ifndef HEADER_ARRAY_HPP
#define HEADER_ARRAY_HPP
#include <cstddef>
#include <iterator>
#include <stdexcept>
template <class T, std::size_t N>
struct array {
using value_type = T;
using size_type = std::size_t;
using difference_type = std::ptrdiff_t;
using reference = value_type&;
using const_reference = const value_type&;
using pointer = value_type*;
using const_pointer = const value_type*;
using iterator = value_type*;
using const_iterator = const value_type*;
using reverse_iterator = std::reverse_iterator<iterator>;
using const_reverse_iterator = std::reverse_iterator<const_iterator>;
const_reference at(size_type pos) const {
return pos < size() ? Data[pos] : throw std::out_of_range("");
}
const_reference operator[](size_type pos) const {
return Data[pos];
}
reference front() {
return *begin();
}
const_reference front() const {
return *begin();
}
reference back() {
return *std::prev(end());
}
const_reference back() const {
return *std::prev(end());
}
T *data() noexcept {
return Data;
}
const T *data() const noexcept {
return Data;
}
iterator begin() noexcept {
return Data;
}
const_iterator begin() const noexcept {
return Data;
}
const_iterator cbegin() const noexcept {
return Data;
}
iterator end() noexcept {
return Data + size();
}
const_iterator end() const noexcept {
return Data + size();
}
const_iterator cend() const noexcept {
return Data + size();
}
reverse_iterator rbegin() noexcept {
return reverse_iterator(end());
}
const_reverse_iterator rbegin() const noexcept {
return const_reverse_iterator(end());
}
const_reverse_iterator crbegin() const noexcept {
return const_reverse_iterator(end());
}
reverse_iterator rend() noexcept {
return reverse_iterator(begin());
}
const_reverse_iterator rend() const noexcept {
return const_reverse_iterator(begin());
}
const_reverse_iterator crend() const noexcept {
return const_reverse_iterator(begin());
}
constexpr bool empty() const noexcept {
return begin() == end();
}
constexpr size_type size() const noexcept {
return N;
}
constexpr size_type max_size() const noexcept {
return N;
}
void fill(const T& value) {
size_type i = 0;
for (; i < size(); i++) {
Data[i] = value;
}
}
void swap(array& other) noexcept {
size_type i;
for (i = 0; i < other.size(); i++) {
other.Data[i] = Data[i];
}
for (i = 0; i < size(); i++) {
Data[i] = other.Data[i];
}
}
private:
T Data[N];
};
#endif // HEADER_ARRAY_HPP
std::array
是一个聚合,具有隐式声明的构造函数,该构造函数按照聚合初始化规则初始化数组。聚合条件之一是,聚合没有私有或受保护的直接非静态数据成员。
由于Data
是私有的,因此您所期望的封闭数组的聚合初始化是不可能的。将data
设为公共类成员,就可以使示例正常工作。
相关文章:
- "error: no matching function for call to"构造函数错误
- 为什么类中的ostringstream类型的成员会导致";调用隐含删除复制构造函数";错误
- 模板,函数使用错误的构造函数来复制我的对象
- C++ OpenCV 卡尔曼滤波器构造函数错误
- 不命名构造函数和析构函数上的类型错误
- 处理简单 cpp 类构造函数中的错误
- 类和构造函数中的函数根本不起作用,并且不返回任何错误
- 链接器错误:无法解析构造函数
- 当我尝试通过构造函数分配 char 数组时出现错误
- 没有参数的构造函数给我错误
- 使用复制构造函数的程序输出错误
- 默认构造函数上的分段错误
- 错误: 无效使用非静态数据成员"应用程序::应用程序构造函数"
- 为什么定义复制构造函数会给我错误:无法将类型 'obj&' 的非常量左值引用绑定到类型为"obj"的右值?
- 带有 QWidget 的分段错误构造函数.Qt/C++
- C++错误构造函数参数
- 错误:构造函数未命名类型
- 错误:构造函数在此上下文中受到保护
- 没有匹配的函数错误C++构造函数
- 错误:构造函数的多个定义