是否可以从 constexpr 函数初始化 constexpr std::array?
Is it possible to initialize a constexpr std::array from a constexpr function?
我正在尝试制作一个应该是 {1, 2, 3, 4, 5, 6, 7, 8, 0}
的数组,我想做这样的事情:
constexpr std::array<int, 9> getFinalTable(){
std::array<int, 9> result{};
for (size_t i = 0; i < 9 - 1; ++i)
result[i] = i + 1;
result.back() = 0;
return result;
}
但是 Visual Studio 在这里打字时阻止了我:
constexpr std::array<int, 9> final_table = getFinalTable();
有没有可能做我想做的事? (我想要这样,所以我可以随时更改 Table
的大小并且仍然有效)。
它将在 -std=c++17
(C++17 及更高版本)编译中正常工作。
从这个问题的第一个答案来看, 的评论表明该行:
result.back() = 0;
由于以下原因,不会让编译器编译它:
main.cpp: In function 'constexpr std::array<int, 9> getFinalTable()':
main.cpp:9:21: error: call to non-'constexpr' function 'std::array<_Tp, _Nm>::value_type& std::array<_Tp, _Nm>::back() [with _Tp = int; long long unsigned int _Nm = 9; std::array<_Tp, _Nm>::reference = int&; std::array<_Tp, _Nm>::value_type = int]'
9 | result.back() = 0;
|
删除后,相关程序应如下所示:
const int size = 9;
constexpr std::array<int, size> getFinalTable() {
std::array<int, size> result{};
for (size_t i = 0; i < size - 1; ++i)
result[i] = i + 1;
// result.back() = 0;
return result;
}
int main(void) {
const std::array<int, size> final_table = getFinalTable();
}
我正在尝试制作一个应该是 {1, 2, 3, 4, 5, 6, 7, 8, 0}
的数组,我想做这样的事情:
constexpr std::array<int, 9> getFinalTable(){
std::array<int, 9> result{};
for (size_t i = 0; i < 9 - 1; ++i)
result[i] = i + 1;
result.back() = 0;
return result;
}
但是 Visual Studio 在这里打字时阻止了我:
constexpr std::array<int, 9> final_table = getFinalTable();
有没有可能做我想做的事? (我想要这样,所以我可以随时更改 Table
的大小并且仍然有效)。
它将在 -std=c++17
(C++17 及更高版本)编译中正常工作。
从这个问题的第一个答案来看,
result.back() = 0;
由于以下原因,不会让编译器编译它:
main.cpp: In function 'constexpr std::array<int, 9> getFinalTable()':
main.cpp:9:21: error: call to non-'constexpr' function 'std::array<_Tp, _Nm>::value_type& std::array<_Tp, _Nm>::back() [with _Tp = int; long long unsigned int _Nm = 9; std::array<_Tp, _Nm>::reference = int&; std::array<_Tp, _Nm>::value_type = int]'
9 | result.back() = 0;
|
删除后,相关程序应如下所示:
const int size = 9;
constexpr std::array<int, size> getFinalTable() {
std::array<int, size> result{};
for (size_t i = 0; i < size - 1; ++i)
result[i] = i + 1;
// result.back() = 0;
return result;
}
int main(void) {
const std::array<int, size> final_table = getFinalTable();
}