首页 > 解决方案 > 是否可以从 constexpr 函数初始化 constexpr std::array ?

问题描述

我试图制作一个应该是的数组,{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();

有可能做我想做的事吗?(我想要这样,这样我就可以随时更改Tablein 的大小并且仍然可以使用)。

标签: c++c++14constexpr

解决方案


-std=c++17它可以在(C++17 及更高版本)编译中正常工作。

从这个问题的第一个答案开始,OP的评论表明该行:

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();
}

推荐阅读