难道你不能通过制作一个 returns 的 constexpr 函数来制作一个 constexpr 数组吗?
Can't you just make a constexpr array by making a constexpr function that returns one?
我想在编译时构造一个数组值,并且在网上看到多个来源建议使用带有 constexpr 构造函数的结构:
template<int N>
struct A {
constexpr A() : arr() {
for (auto i = 0; i != N; ++i)
arr[i] = i;
}
int arr[N];
};
int main() {
constexpr auto a = A<4>();
for (auto x : a.arr)
std::cout << x << '\n';
}
这只是旧建议(也许是 C++17 之前的建议?)还是我遗漏了什么,因为在我看来我只能执行以下操作:
constexpr std::array<int, 4> get_ary() {
std::array<int, 4> ary = {};
for (int i = 0; i < 4; ++i) {
ary[i] = i;
}
return ary;
}
int main() {
constexpr auto ary = get_ary();
static_assert(ary.size() == 4, "The length should be 4!");
}
Can't you just make a constexpr array by making a constexpr function that returns one?
不,您不能 return 来自函数的数组,无论它是否为 constexpr。
但是,您可以 return 包含数组作为成员的 class 实例。您的 A
是此类 class 模板的示例,std::array
也是。两个例子都是允许的。
std::array
示例在 C++17 之前无法运行。 returning 没有问题,但是使用非 constexpr operator[]
.
有问题
我想在编译时构造一个数组值,并且在网上看到多个来源建议使用带有 constexpr 构造函数的结构:
template<int N>
struct A {
constexpr A() : arr() {
for (auto i = 0; i != N; ++i)
arr[i] = i;
}
int arr[N];
};
int main() {
constexpr auto a = A<4>();
for (auto x : a.arr)
std::cout << x << '\n';
}
这只是旧建议(也许是 C++17 之前的建议?)还是我遗漏了什么,因为在我看来我只能执行以下操作:
constexpr std::array<int, 4> get_ary() {
std::array<int, 4> ary = {};
for (int i = 0; i < 4; ++i) {
ary[i] = i;
}
return ary;
}
int main() {
constexpr auto ary = get_ary();
static_assert(ary.size() == 4, "The length should be 4!");
}
Can't you just make a constexpr array by making a constexpr function that returns one?
不,您不能 return 来自函数的数组,无论它是否为 constexpr。
但是,您可以 return 包含数组作为成员的 class 实例。您的 A
是此类 class 模板的示例,std::array
也是。两个例子都是允许的。
std::array
示例在 C++17 之前无法运行。 returning 没有问题,但是使用非 constexpr operator[]
.