【发布时间】:2019-11-05 21:22:32
【问题描述】:
我定义并初始化了一个类似于以下内容的数据结构:
#include <vector>
#include <array>
struct SomeStruct {
std::vector<int> vec;
};
int main() {
std::array<SomeStruct, 2> arr {
SomeStruct {
.vec = {
1, 2
}
},
SomeStruct {
.vec = {
3, 4, 5
}
}
};
}
这编译正确,但由于整个结构在编译时是已知的,因此我尝试将其设为constexpr。
在前面的示例中简单地将arr 声明为constexpr 会导致错误:
main.cpp: In function ‘int main()’:
main.cpp:20:5: error: the type ‘const std::array’ of constexpr variable ‘arr’ is not literal
};
^
In file included from main.cpp:2:0:
/usr/include/c++/7/array:94:12: note: ‘std::array’ is not literal because:
struct array
^~~~~
/usr/include/c++/7/array:94:12: note: ‘std::array’ has a non-trivial destructor
我猜这是因为 std::vector 没有 constexpr 构造函数/析构函数。
然后我尝试在包含结构上使用带有模板的std::array:
#include <array>
template <int N>
struct SomeStruct {
std::array<int, N> vec;
};
int main() {
constexpr std::array<SomeStruct, 2> arr {
SomeStruct<2> {
.vec = {
1, 2
}
},
SomeStruct<3> {
.vec = {
3, 4, 5
}
}
};
}
这也会导致错误:
main.cpp: In function ‘int main()’:
main.cpp:10:39: error: type/value mismatch at argument 1 in template parameter list for ‘template struct std::array’
constexpr std::array<SomeStruct, 2> arr {
^
main.cpp:10:39: note: expected a type, got ‘SomeStruct’
main.cpp:10:41: error: scalar object ‘arr’ requires one element in initializer
constexpr std::array<SomeStruct, 2> arr {
^~~
但我不能给 SomeStruct 模板参数,因为大小可能不同。
像这样定义constexpr 数据结构的最佳方法是什么?
【问题讨论】:
-
您使用的是哪个编译器?我收到
SomeStruct在 clang 中缺少其模板参数的错误。在 g++ 中,我得到了你所做的错误(所以我假设这就是你使用的),但是我输入了SomeStruct的模板参数并且那个错误消失了(但是我在两个元素之间有一个不匹配,因为一个是尺寸 2,另一个是 3)。 godbolt.org/z/lQp3HT -
@ChrisMM 是的,我正在使用 GCC。我你是对的,我的代码中有一个不同的错误,但是如果不引起你看到的错误就无法解决。更新了问题以澄清。